@fairyhunter13/opentui-core 0.1.112 → 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 +63 -51
- 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-8fks7yv1.js +0 -411
- package/index-8fks7yv1.js.map +0 -10
- package/index-egy5e2rs.js +0 -12267
- package/index-egy5e2rs.js.map +0 -42
- package/index-tse8gzh0.js +0 -20614
- package/index-tse8gzh0.js.map +0 -67
- 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,816 @@
|
|
|
1
|
+
import { describe, test, expect, beforeEach, afterEach } from "bun:test"
|
|
2
|
+
import { createTestRenderer, type TestRenderer } from "../../testing.js"
|
|
3
|
+
import { LineNumberRenderable } from "../LineNumberRenderable.js"
|
|
4
|
+
import { CodeRenderable } from "../Code.js"
|
|
5
|
+
import { BoxRenderable } from "../Box.js"
|
|
6
|
+
import { ScrollBoxRenderable } from "../ScrollBox.js"
|
|
7
|
+
import { SyntaxStyle } from "../../syntax-style.js"
|
|
8
|
+
import { RGBA } from "../../lib/RGBA.js"
|
|
9
|
+
|
|
10
|
+
let currentRenderer: TestRenderer
|
|
11
|
+
let renderOnce: () => Promise<void>
|
|
12
|
+
let captureCharFrame: () => string
|
|
13
|
+
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
const testRenderer = await createTestRenderer({ width: 60, height: 20 })
|
|
16
|
+
currentRenderer = testRenderer.renderer
|
|
17
|
+
renderOnce = testRenderer.renderOnce
|
|
18
|
+
captureCharFrame = testRenderer.captureCharFrame
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
afterEach(async () => {
|
|
22
|
+
if (currentRenderer) {
|
|
23
|
+
currentRenderer.destroy()
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Helper to generate multi-line code content
|
|
28
|
+
function generateCode(lineCount: number): string {
|
|
29
|
+
const lines: string[] = []
|
|
30
|
+
for (let i = 1; i <= lineCount; i++) {
|
|
31
|
+
lines.push(`function test${i}() {`)
|
|
32
|
+
lines.push(` console.log("Line ${i}");`)
|
|
33
|
+
lines.push(` return ${i};`)
|
|
34
|
+
lines.push(`}`)
|
|
35
|
+
}
|
|
36
|
+
return lines.join("\n")
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe("LineNumberRenderable in ScrollBox", () => {
|
|
40
|
+
test("single Code renderable with line numbers in ScrollBox - correct dimensions", async () => {
|
|
41
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
42
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const code = generateCode(20) // 80 lines of code
|
|
46
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
47
|
+
id: "code-1",
|
|
48
|
+
content: code,
|
|
49
|
+
filetype: "javascript",
|
|
50
|
+
syntaxStyle,
|
|
51
|
+
width: "100%",
|
|
52
|
+
height: "auto",
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
56
|
+
id: "line-number-1",
|
|
57
|
+
target: codeRenderable,
|
|
58
|
+
minWidth: 3,
|
|
59
|
+
paddingRight: 1,
|
|
60
|
+
fg: "#888888",
|
|
61
|
+
bg: "transparent",
|
|
62
|
+
width: "100%",
|
|
63
|
+
height: "100%",
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
67
|
+
id: "box-1",
|
|
68
|
+
border: true,
|
|
69
|
+
borderStyle: "single",
|
|
70
|
+
borderColor: "#ffffff",
|
|
71
|
+
width: 30,
|
|
72
|
+
height: 10,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
box.add(lineNumberRenderable)
|
|
76
|
+
|
|
77
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
78
|
+
id: "scroll-1",
|
|
79
|
+
width: "100%",
|
|
80
|
+
height: "100%",
|
|
81
|
+
scrollY: true,
|
|
82
|
+
scrollX: false,
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
scrollBox.add(box)
|
|
86
|
+
currentRenderer.root.add(scrollBox)
|
|
87
|
+
|
|
88
|
+
await renderOnce()
|
|
89
|
+
|
|
90
|
+
// Check initial dimensions
|
|
91
|
+
const gutter = lineNumberRenderable["gutter"]
|
|
92
|
+
expect(gutter).toBeDefined()
|
|
93
|
+
expect(gutter!.width).toBeGreaterThan(0)
|
|
94
|
+
expect(gutter!.height).toBeGreaterThan(0)
|
|
95
|
+
|
|
96
|
+
// Box should have correct dimensions (minus borders)
|
|
97
|
+
expect(box.width).toBe(30)
|
|
98
|
+
expect(box.height).toBe(10)
|
|
99
|
+
|
|
100
|
+
// LineNumberRenderable should fill the box (minus borders)
|
|
101
|
+
expect(lineNumberRenderable.width).toBe(28) // 30 - 2 for borders
|
|
102
|
+
expect(lineNumberRenderable.height).toBe(8) // 10 - 2 for borders
|
|
103
|
+
|
|
104
|
+
const frame = captureCharFrame()
|
|
105
|
+
expect(frame).toMatchSnapshot()
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test("single Code renderable in ScrollBox - scroll and verify dimensions", async () => {
|
|
109
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
110
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const code = generateCode(30) // 120 lines of code
|
|
114
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
115
|
+
id: "code-scroll",
|
|
116
|
+
content: code,
|
|
117
|
+
filetype: "javascript",
|
|
118
|
+
syntaxStyle,
|
|
119
|
+
width: "100%",
|
|
120
|
+
height: "auto",
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
124
|
+
id: "line-number-scroll",
|
|
125
|
+
target: codeRenderable,
|
|
126
|
+
minWidth: 3,
|
|
127
|
+
paddingRight: 1,
|
|
128
|
+
fg: "#888888",
|
|
129
|
+
width: "100%",
|
|
130
|
+
height: "100%",
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
134
|
+
id: "box-scroll",
|
|
135
|
+
border: true,
|
|
136
|
+
width: 40,
|
|
137
|
+
height: 12,
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
box.add(lineNumberRenderable)
|
|
141
|
+
|
|
142
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
143
|
+
id: "scroll-scroll",
|
|
144
|
+
width: "100%",
|
|
145
|
+
height: "100%",
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
scrollBox.add(box)
|
|
149
|
+
currentRenderer.root.add(scrollBox)
|
|
150
|
+
|
|
151
|
+
await renderOnce()
|
|
152
|
+
|
|
153
|
+
const gutterBeforeScroll = lineNumberRenderable["gutter"]!
|
|
154
|
+
const widthBeforeScroll = gutterBeforeScroll.width
|
|
155
|
+
const heightBeforeScroll = gutterBeforeScroll.height
|
|
156
|
+
const lineNumWidthBeforeScroll = lineNumberRenderable.width
|
|
157
|
+
const lineNumHeightBeforeScroll = lineNumberRenderable.height
|
|
158
|
+
|
|
159
|
+
const frameBeforeScroll = captureCharFrame()
|
|
160
|
+
expect(frameBeforeScroll).toMatchSnapshot()
|
|
161
|
+
|
|
162
|
+
// Scroll down
|
|
163
|
+
scrollBox.scrollBy(10)
|
|
164
|
+
await renderOnce()
|
|
165
|
+
|
|
166
|
+
const gutterAfterScroll = lineNumberRenderable["gutter"]!
|
|
167
|
+
const widthAfterScroll = gutterAfterScroll.width
|
|
168
|
+
const heightAfterScroll = gutterAfterScroll.height
|
|
169
|
+
const lineNumWidthAfterScroll = lineNumberRenderable.width
|
|
170
|
+
const lineNumHeightAfterScroll = lineNumberRenderable.height
|
|
171
|
+
|
|
172
|
+
// Dimensions should remain stable after scrolling
|
|
173
|
+
expect(widthAfterScroll).toBe(widthBeforeScroll)
|
|
174
|
+
expect(heightAfterScroll).toBe(heightBeforeScroll)
|
|
175
|
+
expect(lineNumWidthAfterScroll).toBe(lineNumWidthBeforeScroll)
|
|
176
|
+
expect(lineNumHeightAfterScroll).toBe(lineNumHeightBeforeScroll)
|
|
177
|
+
|
|
178
|
+
const frameAfterScroll = captureCharFrame()
|
|
179
|
+
expect(frameAfterScroll).toMatchSnapshot()
|
|
180
|
+
|
|
181
|
+
// Scroll to bottom
|
|
182
|
+
scrollBox.scrollBy(1000)
|
|
183
|
+
await renderOnce()
|
|
184
|
+
|
|
185
|
+
const widthAtBottom = lineNumberRenderable["gutter"]!.width
|
|
186
|
+
const heightAtBottom = lineNumberRenderable["gutter"]!.height
|
|
187
|
+
|
|
188
|
+
expect(widthAtBottom).toBe(widthBeforeScroll)
|
|
189
|
+
expect(heightAtBottom).toBe(heightBeforeScroll)
|
|
190
|
+
|
|
191
|
+
const frameAtBottom = captureCharFrame()
|
|
192
|
+
expect(frameAtBottom).toMatchSnapshot()
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
test("multiple Code renderables with line numbers in ScrollBox - correct dimensions", async () => {
|
|
196
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
197
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
201
|
+
id: "scroll-multi",
|
|
202
|
+
width: "100%",
|
|
203
|
+
height: "100%",
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
currentRenderer.root.add(scrollBox)
|
|
207
|
+
|
|
208
|
+
const boxes: BoxRenderable[] = []
|
|
209
|
+
const lineNumberRenderables: LineNumberRenderable[] = []
|
|
210
|
+
|
|
211
|
+
// Create 3 code blocks with line numbers in boxes
|
|
212
|
+
for (let i = 1; i <= 3; i++) {
|
|
213
|
+
const code = generateCode(5 + i * 2) // Different sizes
|
|
214
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
215
|
+
id: `code-${i}`,
|
|
216
|
+
content: code,
|
|
217
|
+
filetype: "javascript",
|
|
218
|
+
syntaxStyle,
|
|
219
|
+
width: "100%",
|
|
220
|
+
height: "auto",
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
224
|
+
id: `line-number-${i}`,
|
|
225
|
+
target: codeRenderable,
|
|
226
|
+
minWidth: 3,
|
|
227
|
+
paddingRight: 1,
|
|
228
|
+
fg: "#888888",
|
|
229
|
+
width: "100%",
|
|
230
|
+
height: "100%",
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
234
|
+
id: `box-${i}`,
|
|
235
|
+
border: true,
|
|
236
|
+
width: 50,
|
|
237
|
+
height: 8,
|
|
238
|
+
marginBottom: 2,
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
box.add(lineNumberRenderable)
|
|
242
|
+
scrollBox.add(box)
|
|
243
|
+
|
|
244
|
+
boxes.push(box)
|
|
245
|
+
lineNumberRenderables.push(lineNumberRenderable)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
await renderOnce()
|
|
249
|
+
|
|
250
|
+
const frame1 = captureCharFrame()
|
|
251
|
+
expect(frame1).toMatchSnapshot()
|
|
252
|
+
|
|
253
|
+
// Verify all boxes have correct dimensions
|
|
254
|
+
for (let i = 0; i < 3; i++) {
|
|
255
|
+
const box = boxes[i]
|
|
256
|
+
expect(box.width).toBe(50)
|
|
257
|
+
expect(box.height).toBe(8)
|
|
258
|
+
|
|
259
|
+
const lineNumberRenderable = lineNumberRenderables[i]
|
|
260
|
+
expect(lineNumberRenderable.width).toBe(48) // 50 - 2 for borders
|
|
261
|
+
expect(lineNumberRenderable.height).toBe(6) // 8 - 2 for borders
|
|
262
|
+
|
|
263
|
+
const gutter = lineNumberRenderable["gutter"]
|
|
264
|
+
expect(gutter).toBeDefined()
|
|
265
|
+
expect(gutter!.width).toBeGreaterThan(0)
|
|
266
|
+
expect(gutter!.height).toBe(6)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Scroll down
|
|
270
|
+
scrollBox.scrollBy(5)
|
|
271
|
+
await renderOnce()
|
|
272
|
+
|
|
273
|
+
const frame2 = captureCharFrame()
|
|
274
|
+
expect(frame2).toMatchSnapshot()
|
|
275
|
+
|
|
276
|
+
// Dimensions should remain stable
|
|
277
|
+
for (let i = 0; i < 3; i++) {
|
|
278
|
+
const lineNumberRenderable = lineNumberRenderables[i]
|
|
279
|
+
expect(lineNumberRenderable.width).toBe(48)
|
|
280
|
+
expect(lineNumberRenderable.height).toBe(6)
|
|
281
|
+
|
|
282
|
+
const gutter = lineNumberRenderable["gutter"]
|
|
283
|
+
expect(gutter!.width).toBeGreaterThan(0)
|
|
284
|
+
expect(gutter!.height).toBe(6)
|
|
285
|
+
}
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
test("nested boxes with different border styles - dimensions correct", async () => {
|
|
289
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
290
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
const code = generateCode(25)
|
|
294
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
295
|
+
id: "code-nested",
|
|
296
|
+
content: code,
|
|
297
|
+
filetype: "javascript",
|
|
298
|
+
syntaxStyle,
|
|
299
|
+
width: "100%",
|
|
300
|
+
height: "auto",
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
304
|
+
id: "line-number-nested",
|
|
305
|
+
target: codeRenderable,
|
|
306
|
+
minWidth: 4,
|
|
307
|
+
paddingRight: 2,
|
|
308
|
+
fg: "#888888",
|
|
309
|
+
width: "100%",
|
|
310
|
+
height: "100%",
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
// Inner box with border
|
|
314
|
+
const innerBox = new BoxRenderable(currentRenderer, {
|
|
315
|
+
id: "inner-box",
|
|
316
|
+
border: true,
|
|
317
|
+
borderStyle: "rounded",
|
|
318
|
+
borderColor: "#00ff00",
|
|
319
|
+
padding: 1,
|
|
320
|
+
width: 45,
|
|
321
|
+
height: 15,
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
innerBox.add(lineNumberRenderable)
|
|
325
|
+
|
|
326
|
+
// Outer box with border
|
|
327
|
+
const outerBox = new BoxRenderable(currentRenderer, {
|
|
328
|
+
id: "outer-box",
|
|
329
|
+
border: true,
|
|
330
|
+
borderStyle: "double",
|
|
331
|
+
borderColor: "#ff0000",
|
|
332
|
+
padding: 2,
|
|
333
|
+
width: 55,
|
|
334
|
+
height: 19,
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
outerBox.add(innerBox)
|
|
338
|
+
|
|
339
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
340
|
+
id: "scroll-nested",
|
|
341
|
+
width: "100%",
|
|
342
|
+
height: "100%",
|
|
343
|
+
})
|
|
344
|
+
|
|
345
|
+
scrollBox.add(outerBox)
|
|
346
|
+
currentRenderer.root.add(scrollBox)
|
|
347
|
+
|
|
348
|
+
await renderOnce()
|
|
349
|
+
|
|
350
|
+
const frame1 = captureCharFrame()
|
|
351
|
+
expect(frame1).toMatchSnapshot()
|
|
352
|
+
|
|
353
|
+
// Check outer box
|
|
354
|
+
expect(outerBox.width).toBe(55)
|
|
355
|
+
expect(outerBox.height).toBe(19)
|
|
356
|
+
|
|
357
|
+
// Check inner box (inside outer box padding and borders)
|
|
358
|
+
expect(innerBox.width).toBe(45)
|
|
359
|
+
expect(innerBox.height).toBe(15)
|
|
360
|
+
|
|
361
|
+
// Check line number renderable (inside inner box padding and borders)
|
|
362
|
+
// Inner box: 45 - 2 (borders) - 2 (padding) = 41
|
|
363
|
+
expect(lineNumberRenderable.width).toBe(41)
|
|
364
|
+
// Inner box: 15 - 2 (borders) - 2 (padding) = 11
|
|
365
|
+
expect(lineNumberRenderable.height).toBe(11)
|
|
366
|
+
|
|
367
|
+
const gutter = lineNumberRenderable["gutter"]!
|
|
368
|
+
expect(gutter.width).toBeGreaterThan(4) // At least minWidth + padding
|
|
369
|
+
expect(gutter.height).toBe(11)
|
|
370
|
+
|
|
371
|
+
// Scroll and verify dimensions remain stable
|
|
372
|
+
scrollBox.scrollBy(20)
|
|
373
|
+
await renderOnce()
|
|
374
|
+
|
|
375
|
+
const frame2 = captureCharFrame()
|
|
376
|
+
expect(frame2).toMatchSnapshot()
|
|
377
|
+
|
|
378
|
+
expect(lineNumberRenderable.width).toBe(41)
|
|
379
|
+
expect(lineNumberRenderable.height).toBe(11)
|
|
380
|
+
expect(gutter.width).toBeGreaterThan(4)
|
|
381
|
+
expect(gutter.height).toBe(11)
|
|
382
|
+
})
|
|
383
|
+
|
|
384
|
+
test("ScrollBox with horizontal and vertical scrolling - dimensions stable", async () => {
|
|
385
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
386
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
387
|
+
})
|
|
388
|
+
|
|
389
|
+
// Create very long lines
|
|
390
|
+
const longLines: string[] = []
|
|
391
|
+
for (let i = 1; i <= 50; i++) {
|
|
392
|
+
longLines.push(
|
|
393
|
+
`const veryLongVariableName${i} = "This is a very long line that should require horizontal scrolling to view completely";`,
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
const code = longLines.join("\n")
|
|
397
|
+
|
|
398
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
399
|
+
id: "code-long",
|
|
400
|
+
content: code,
|
|
401
|
+
filetype: "javascript",
|
|
402
|
+
syntaxStyle,
|
|
403
|
+
width: "auto",
|
|
404
|
+
height: "auto",
|
|
405
|
+
})
|
|
406
|
+
|
|
407
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
408
|
+
id: "line-number-long",
|
|
409
|
+
target: codeRenderable,
|
|
410
|
+
minWidth: 3,
|
|
411
|
+
paddingRight: 1,
|
|
412
|
+
fg: "#888888",
|
|
413
|
+
width: "100%",
|
|
414
|
+
height: "100%",
|
|
415
|
+
})
|
|
416
|
+
|
|
417
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
418
|
+
id: "box-long",
|
|
419
|
+
border: true,
|
|
420
|
+
width: 50,
|
|
421
|
+
height: 15,
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
box.add(lineNumberRenderable)
|
|
425
|
+
|
|
426
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
427
|
+
id: "scroll-long",
|
|
428
|
+
width: "100%",
|
|
429
|
+
height: "100%",
|
|
430
|
+
scrollX: true,
|
|
431
|
+
scrollY: true,
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
scrollBox.add(box)
|
|
435
|
+
currentRenderer.root.add(scrollBox)
|
|
436
|
+
|
|
437
|
+
await renderOnce()
|
|
438
|
+
|
|
439
|
+
const initialWidth = lineNumberRenderable.width
|
|
440
|
+
const initialHeight = lineNumberRenderable.height
|
|
441
|
+
const initialGutterWidth = lineNumberRenderable["gutter"]!.width
|
|
442
|
+
const initialGutterHeight = lineNumberRenderable["gutter"]!.height
|
|
443
|
+
|
|
444
|
+
const frame1 = captureCharFrame()
|
|
445
|
+
expect(frame1).toMatchSnapshot()
|
|
446
|
+
|
|
447
|
+
// Scroll vertically
|
|
448
|
+
scrollBox.scrollBy({ x: 0, y: 10 })
|
|
449
|
+
await renderOnce()
|
|
450
|
+
|
|
451
|
+
expect(lineNumberRenderable.width).toBe(initialWidth)
|
|
452
|
+
expect(lineNumberRenderable.height).toBe(initialHeight)
|
|
453
|
+
expect(lineNumberRenderable["gutter"]!.width).toBe(initialGutterWidth)
|
|
454
|
+
expect(lineNumberRenderable["gutter"]!.height).toBe(initialGutterHeight)
|
|
455
|
+
|
|
456
|
+
const frame2 = captureCharFrame()
|
|
457
|
+
expect(frame2).toMatchSnapshot()
|
|
458
|
+
|
|
459
|
+
// Scroll horizontally (shouldn't affect line numbers much)
|
|
460
|
+
scrollBox.scrollBy({ x: 20, y: 0 })
|
|
461
|
+
await renderOnce()
|
|
462
|
+
|
|
463
|
+
expect(lineNumberRenderable.width).toBe(initialWidth)
|
|
464
|
+
expect(lineNumberRenderable.height).toBe(initialHeight)
|
|
465
|
+
expect(lineNumberRenderable["gutter"]!.width).toBe(initialGutterWidth)
|
|
466
|
+
expect(lineNumberRenderable["gutter"]!.height).toBe(initialGutterHeight)
|
|
467
|
+
|
|
468
|
+
const frame3 = captureCharFrame()
|
|
469
|
+
expect(frame3).toMatchSnapshot()
|
|
470
|
+
|
|
471
|
+
// Scroll both
|
|
472
|
+
scrollBox.scrollBy({ x: 10, y: 15 })
|
|
473
|
+
await renderOnce()
|
|
474
|
+
|
|
475
|
+
expect(lineNumberRenderable.width).toBe(initialWidth)
|
|
476
|
+
expect(lineNumberRenderable.height).toBe(initialHeight)
|
|
477
|
+
expect(lineNumberRenderable["gutter"]!.width).toBe(initialGutterWidth)
|
|
478
|
+
expect(lineNumberRenderable["gutter"]!.height).toBe(initialGutterHeight)
|
|
479
|
+
|
|
480
|
+
const frame4 = captureCharFrame()
|
|
481
|
+
expect(frame4).toMatchSnapshot()
|
|
482
|
+
})
|
|
483
|
+
|
|
484
|
+
test("gutter width changes with line count - verify remeasure", async () => {
|
|
485
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
486
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
487
|
+
})
|
|
488
|
+
|
|
489
|
+
// Start with 9 lines (1 digit line numbers)
|
|
490
|
+
let code = generateCode(2) // 8 lines
|
|
491
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
492
|
+
id: "code-growing",
|
|
493
|
+
content: code,
|
|
494
|
+
filetype: "javascript",
|
|
495
|
+
syntaxStyle,
|
|
496
|
+
width: "100%",
|
|
497
|
+
height: "auto",
|
|
498
|
+
})
|
|
499
|
+
|
|
500
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
501
|
+
id: "line-number-growing",
|
|
502
|
+
target: codeRenderable,
|
|
503
|
+
minWidth: 2,
|
|
504
|
+
paddingRight: 1,
|
|
505
|
+
fg: "#888888",
|
|
506
|
+
width: "100%",
|
|
507
|
+
height: "100%",
|
|
508
|
+
})
|
|
509
|
+
|
|
510
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
511
|
+
id: "box-growing",
|
|
512
|
+
border: true,
|
|
513
|
+
width: 40,
|
|
514
|
+
height: 12,
|
|
515
|
+
})
|
|
516
|
+
|
|
517
|
+
box.add(lineNumberRenderable)
|
|
518
|
+
|
|
519
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
520
|
+
id: "scroll-growing",
|
|
521
|
+
width: "100%",
|
|
522
|
+
height: "100%",
|
|
523
|
+
})
|
|
524
|
+
|
|
525
|
+
scrollBox.add(box)
|
|
526
|
+
currentRenderer.root.add(scrollBox)
|
|
527
|
+
|
|
528
|
+
await renderOnce()
|
|
529
|
+
|
|
530
|
+
const widthWith1Digit = lineNumberRenderable["gutter"]!.width
|
|
531
|
+
const frame1 = captureCharFrame()
|
|
532
|
+
expect(frame1).toMatchSnapshot()
|
|
533
|
+
// minWidth is 2, paddingRight is 1, so minimum is 3 (2 + 1)
|
|
534
|
+
// But also includes +1 for left padding and maxBeforeWidth/maxAfterWidth (0 in this case)
|
|
535
|
+
// So base minimum is 4 total for 1 digit numbers
|
|
536
|
+
|
|
537
|
+
// Now update to have more than 9 lines (2 digit line numbers)
|
|
538
|
+
code = generateCode(5) // 20 lines
|
|
539
|
+
codeRenderable.content = code
|
|
540
|
+
await renderOnce()
|
|
541
|
+
|
|
542
|
+
const widthWith2Digits = lineNumberRenderable["gutter"]!.width
|
|
543
|
+
const frame2 = captureCharFrame()
|
|
544
|
+
expect(frame2).toMatchSnapshot()
|
|
545
|
+
|
|
546
|
+
// Width stays the same because minWidth 2 is still enough for 2-digit numbers
|
|
547
|
+
// The gutter width calculation is: max(minWidth, digits + paddingRight + 1)
|
|
548
|
+
// For 20 lines: max(2, 2 + 1 + 1) = max(2, 4) = 4
|
|
549
|
+
// But we started with at least 3 or 4
|
|
550
|
+
expect(widthWith2Digits).toBeGreaterThanOrEqual(widthWith1Digit)
|
|
551
|
+
|
|
552
|
+
// Now update to have more than 99 lines (3 digit line numbers)
|
|
553
|
+
code = generateCode(30) // 120 lines
|
|
554
|
+
codeRenderable.content = code
|
|
555
|
+
await renderOnce()
|
|
556
|
+
|
|
557
|
+
const widthWith3Digits = lineNumberRenderable["gutter"]!.width
|
|
558
|
+
const frame3 = captureCharFrame()
|
|
559
|
+
expect(frame3).toMatchSnapshot()
|
|
560
|
+
|
|
561
|
+
// Width should increase for 3-digit numbers
|
|
562
|
+
// For 120 lines: max(2, 3 + 1 + 1) = max(2, 5) = 5
|
|
563
|
+
expect(widthWith3Digits).toBeGreaterThan(widthWith2Digits)
|
|
564
|
+
})
|
|
565
|
+
|
|
566
|
+
test("line colors span full width in ScrollBox", async () => {
|
|
567
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
568
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
569
|
+
})
|
|
570
|
+
|
|
571
|
+
const code = generateCode(15)
|
|
572
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
573
|
+
id: "code-colors",
|
|
574
|
+
content: code,
|
|
575
|
+
filetype: "javascript",
|
|
576
|
+
syntaxStyle,
|
|
577
|
+
width: "100%",
|
|
578
|
+
height: "auto",
|
|
579
|
+
})
|
|
580
|
+
|
|
581
|
+
const lineColors = new Map<number, string>()
|
|
582
|
+
lineColors.set(2, "#2d4a2e") // Green for line 3
|
|
583
|
+
lineColors.set(5, "#4a2d2d") // Red for line 6
|
|
584
|
+
|
|
585
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
586
|
+
id: "line-number-colors",
|
|
587
|
+
target: codeRenderable,
|
|
588
|
+
minWidth: 3,
|
|
589
|
+
paddingRight: 1,
|
|
590
|
+
fg: "#ffffff",
|
|
591
|
+
bg: "#000000",
|
|
592
|
+
lineColors,
|
|
593
|
+
width: "100%",
|
|
594
|
+
height: "100%",
|
|
595
|
+
})
|
|
596
|
+
|
|
597
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
598
|
+
id: "box-colors",
|
|
599
|
+
border: true,
|
|
600
|
+
width: 50,
|
|
601
|
+
height: 12,
|
|
602
|
+
})
|
|
603
|
+
|
|
604
|
+
box.add(lineNumberRenderable)
|
|
605
|
+
|
|
606
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
607
|
+
id: "scroll-colors",
|
|
608
|
+
width: "100%",
|
|
609
|
+
height: "100%",
|
|
610
|
+
})
|
|
611
|
+
|
|
612
|
+
scrollBox.add(box)
|
|
613
|
+
currentRenderer.root.add(scrollBox)
|
|
614
|
+
|
|
615
|
+
await renderOnce()
|
|
616
|
+
|
|
617
|
+
const frame = captureCharFrame()
|
|
618
|
+
expect(frame).toMatchSnapshot()
|
|
619
|
+
|
|
620
|
+
// Scroll to make line 5 visible at top
|
|
621
|
+
scrollBox.scrollBy(5)
|
|
622
|
+
await renderOnce()
|
|
623
|
+
|
|
624
|
+
const frame2 = captureCharFrame()
|
|
625
|
+
expect(frame2).toMatchSnapshot()
|
|
626
|
+
})
|
|
627
|
+
|
|
628
|
+
test("viewport culling with line numbers - dimensions stable", async () => {
|
|
629
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
630
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
631
|
+
})
|
|
632
|
+
|
|
633
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
634
|
+
id: "scroll-culling",
|
|
635
|
+
width: "100%",
|
|
636
|
+
height: "100%",
|
|
637
|
+
viewportCulling: true,
|
|
638
|
+
})
|
|
639
|
+
|
|
640
|
+
currentRenderer.root.add(scrollBox)
|
|
641
|
+
|
|
642
|
+
const boxes: BoxRenderable[] = []
|
|
643
|
+
|
|
644
|
+
// Add many boxes - only visible ones should be rendered
|
|
645
|
+
for (let i = 1; i <= 20; i++) {
|
|
646
|
+
const code = generateCode(3)
|
|
647
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
648
|
+
id: `code-culling-${i}`,
|
|
649
|
+
content: code,
|
|
650
|
+
filetype: "javascript",
|
|
651
|
+
syntaxStyle,
|
|
652
|
+
width: "100%",
|
|
653
|
+
height: "auto",
|
|
654
|
+
})
|
|
655
|
+
|
|
656
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
657
|
+
id: `line-number-culling-${i}`,
|
|
658
|
+
target: codeRenderable,
|
|
659
|
+
minWidth: 3,
|
|
660
|
+
paddingRight: 1,
|
|
661
|
+
fg: "#888888",
|
|
662
|
+
width: "100%",
|
|
663
|
+
height: "100%",
|
|
664
|
+
})
|
|
665
|
+
|
|
666
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
667
|
+
id: `box-culling-${i}`,
|
|
668
|
+
border: true,
|
|
669
|
+
width: 45,
|
|
670
|
+
height: 6,
|
|
671
|
+
marginBottom: 1,
|
|
672
|
+
})
|
|
673
|
+
|
|
674
|
+
box.add(lineNumberRenderable)
|
|
675
|
+
scrollBox.add(box)
|
|
676
|
+
boxes.push(box)
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
await renderOnce()
|
|
680
|
+
|
|
681
|
+
const frame1 = captureCharFrame()
|
|
682
|
+
expect(frame1).toMatchSnapshot()
|
|
683
|
+
|
|
684
|
+
// Scroll through content
|
|
685
|
+
for (let scroll = 0; scroll < 100; scroll += 10) {
|
|
686
|
+
scrollBox.scrollBy(10)
|
|
687
|
+
await renderOnce()
|
|
688
|
+
|
|
689
|
+
// Check that first few boxes have correct dimensions
|
|
690
|
+
for (let i = 0; i < 5 && i < boxes.length; i++) {
|
|
691
|
+
const box = boxes[i]
|
|
692
|
+
expect(box.width).toBe(45)
|
|
693
|
+
expect(box.height).toBe(6)
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
const frame2 = captureCharFrame()
|
|
698
|
+
expect(frame2).toMatchSnapshot()
|
|
699
|
+
})
|
|
700
|
+
|
|
701
|
+
test("EXPECTED FAILURE: Box width changes unexpectedly on first few renders", async () => {
|
|
702
|
+
// This test documents a known issue where box widths may flicker on initial renders
|
|
703
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
704
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
705
|
+
})
|
|
706
|
+
|
|
707
|
+
const code = generateCode(30)
|
|
708
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
709
|
+
id: "code-flicker",
|
|
710
|
+
content: code,
|
|
711
|
+
filetype: "javascript",
|
|
712
|
+
syntaxStyle,
|
|
713
|
+
width: "100%",
|
|
714
|
+
height: "auto",
|
|
715
|
+
})
|
|
716
|
+
|
|
717
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
718
|
+
id: "line-number-flicker",
|
|
719
|
+
target: codeRenderable,
|
|
720
|
+
minWidth: 3,
|
|
721
|
+
paddingRight: 1,
|
|
722
|
+
fg: "#888888",
|
|
723
|
+
width: "100%",
|
|
724
|
+
height: "100%",
|
|
725
|
+
})
|
|
726
|
+
|
|
727
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
728
|
+
id: "box-flicker",
|
|
729
|
+
border: true,
|
|
730
|
+
width: 40,
|
|
731
|
+
height: 12,
|
|
732
|
+
})
|
|
733
|
+
|
|
734
|
+
box.add(lineNumberRenderable)
|
|
735
|
+
|
|
736
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
737
|
+
id: "scroll-flicker",
|
|
738
|
+
width: "100%",
|
|
739
|
+
height: "100%",
|
|
740
|
+
})
|
|
741
|
+
|
|
742
|
+
scrollBox.add(box)
|
|
743
|
+
currentRenderer.root.add(scrollBox)
|
|
744
|
+
|
|
745
|
+
// Capture dimensions across multiple renders
|
|
746
|
+
const widths: number[] = []
|
|
747
|
+
const heights: number[] = []
|
|
748
|
+
|
|
749
|
+
for (let i = 0; i < 5; i++) {
|
|
750
|
+
await renderOnce()
|
|
751
|
+
widths.push(box.width)
|
|
752
|
+
heights.push(box.height)
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// This assertion SHOULD pass if the bug is fixed
|
|
756
|
+
// If it fails, it documents the flickering issue
|
|
757
|
+
const allWidthsSame = widths.every((w) => w === widths[0])
|
|
758
|
+
const allHeightsSame = heights.every((h) => h === heights[0])
|
|
759
|
+
|
|
760
|
+
expect(allWidthsSame).toBe(true)
|
|
761
|
+
expect(allHeightsSame).toBe(true)
|
|
762
|
+
})
|
|
763
|
+
|
|
764
|
+
test("EXPECTED FAILURE: Gutter height may not match parent height initially", async () => {
|
|
765
|
+
const syntaxStyle = SyntaxStyle.fromStyles({
|
|
766
|
+
default: { fg: RGBA.fromValues(1, 1, 1, 1) },
|
|
767
|
+
})
|
|
768
|
+
|
|
769
|
+
const code = generateCode(50)
|
|
770
|
+
const codeRenderable = new CodeRenderable(currentRenderer, {
|
|
771
|
+
id: "code-height",
|
|
772
|
+
content: code,
|
|
773
|
+
filetype: "javascript",
|
|
774
|
+
syntaxStyle,
|
|
775
|
+
width: "100%",
|
|
776
|
+
height: "auto",
|
|
777
|
+
})
|
|
778
|
+
|
|
779
|
+
const lineNumberRenderable = new LineNumberRenderable(currentRenderer, {
|
|
780
|
+
id: "line-number-height",
|
|
781
|
+
target: codeRenderable,
|
|
782
|
+
minWidth: 3,
|
|
783
|
+
paddingRight: 1,
|
|
784
|
+
fg: "#888888",
|
|
785
|
+
width: "100%",
|
|
786
|
+
height: "100%",
|
|
787
|
+
})
|
|
788
|
+
|
|
789
|
+
const box = new BoxRenderable(currentRenderer, {
|
|
790
|
+
id: "box-height",
|
|
791
|
+
border: true,
|
|
792
|
+
width: 40,
|
|
793
|
+
height: 15,
|
|
794
|
+
})
|
|
795
|
+
|
|
796
|
+
box.add(lineNumberRenderable)
|
|
797
|
+
|
|
798
|
+
const scrollBox = new ScrollBoxRenderable(currentRenderer, {
|
|
799
|
+
id: "scroll-height",
|
|
800
|
+
width: "100%",
|
|
801
|
+
height: "100%",
|
|
802
|
+
})
|
|
803
|
+
|
|
804
|
+
scrollBox.add(box)
|
|
805
|
+
currentRenderer.root.add(scrollBox)
|
|
806
|
+
|
|
807
|
+
await renderOnce()
|
|
808
|
+
|
|
809
|
+
const gutter = lineNumberRenderable["gutter"]!
|
|
810
|
+
const expectedHeight = lineNumberRenderable.height
|
|
811
|
+
|
|
812
|
+
// Gutter should have same height as its parent LineNumberRenderable
|
|
813
|
+
// This may fail if there's a layout issue
|
|
814
|
+
expect(gutter.height).toBe(expectedHeight)
|
|
815
|
+
})
|
|
816
|
+
})
|