@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,724 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../Renderable.js"
|
|
2
|
+
import { OptimizedBuffer } from "../buffer.js"
|
|
3
|
+
import type { RenderContext, LineInfoProvider } from "../types.js"
|
|
4
|
+
import { RGBA, parseColor } from "../lib/RGBA.js"
|
|
5
|
+
import { MeasureMode } from "yoga-layout"
|
|
6
|
+
|
|
7
|
+
export interface LineSign {
|
|
8
|
+
before?: string
|
|
9
|
+
beforeColor?: string | RGBA
|
|
10
|
+
after?: string
|
|
11
|
+
afterColor?: string | RGBA
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface LineColorConfig {
|
|
15
|
+
gutter?: string | RGBA
|
|
16
|
+
content?: string | RGBA
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface LineNumberOptions extends RenderableOptions<LineNumberRenderable> {
|
|
20
|
+
target?: Renderable & LineInfoProvider
|
|
21
|
+
fg?: string | RGBA
|
|
22
|
+
bg?: string | RGBA
|
|
23
|
+
minWidth?: number
|
|
24
|
+
paddingRight?: number
|
|
25
|
+
lineColors?: Map<number, string | RGBA | LineColorConfig>
|
|
26
|
+
lineSigns?: Map<number, LineSign>
|
|
27
|
+
lineNumberOffset?: number
|
|
28
|
+
hideLineNumbers?: Set<number>
|
|
29
|
+
lineNumbers?: Map<number, number>
|
|
30
|
+
showLineNumbers?: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const DEFAULT_GUTTER_FG = "#888888"
|
|
34
|
+
const DEFAULT_GUTTER_BG = "transparent"
|
|
35
|
+
|
|
36
|
+
class GutterRenderable extends Renderable {
|
|
37
|
+
private target: Renderable & LineInfoProvider
|
|
38
|
+
private _fg: RGBA
|
|
39
|
+
private _bg: RGBA
|
|
40
|
+
private _minWidth: number
|
|
41
|
+
private _paddingRight: number
|
|
42
|
+
private _lineColorsGutter: Map<number, RGBA>
|
|
43
|
+
private _lineColorsContent: Map<number, RGBA>
|
|
44
|
+
private _lineSigns: Map<number, LineSign>
|
|
45
|
+
private _lineNumberOffset: number
|
|
46
|
+
private _hideLineNumbers: Set<number>
|
|
47
|
+
private _lineNumbers: Map<number, number>
|
|
48
|
+
private _maxBeforeWidth: number = 0
|
|
49
|
+
private _maxAfterWidth: number = 0
|
|
50
|
+
private _lastKnownLineCount: number = 0
|
|
51
|
+
private _lastKnownScrollY: number = 0
|
|
52
|
+
|
|
53
|
+
constructor(
|
|
54
|
+
ctx: RenderContext,
|
|
55
|
+
target: Renderable & LineInfoProvider,
|
|
56
|
+
options: {
|
|
57
|
+
fg: RGBA
|
|
58
|
+
bg: RGBA
|
|
59
|
+
minWidth: number
|
|
60
|
+
paddingRight: number
|
|
61
|
+
lineColorsGutter: Map<number, RGBA>
|
|
62
|
+
lineColorsContent: Map<number, RGBA>
|
|
63
|
+
lineSigns: Map<number, LineSign>
|
|
64
|
+
lineNumberOffset: number
|
|
65
|
+
hideLineNumbers: Set<number>
|
|
66
|
+
lineNumbers?: Map<number, number>
|
|
67
|
+
id?: string
|
|
68
|
+
buffered?: boolean
|
|
69
|
+
},
|
|
70
|
+
) {
|
|
71
|
+
super(ctx, {
|
|
72
|
+
id: options.id,
|
|
73
|
+
width: "auto",
|
|
74
|
+
height: "auto",
|
|
75
|
+
flexGrow: 0,
|
|
76
|
+
flexShrink: 0,
|
|
77
|
+
buffered: options.buffered,
|
|
78
|
+
})
|
|
79
|
+
this.target = target
|
|
80
|
+
this._fg = options.fg
|
|
81
|
+
this._bg = options.bg
|
|
82
|
+
this._minWidth = options.minWidth
|
|
83
|
+
this._paddingRight = options.paddingRight
|
|
84
|
+
this._lineColorsGutter = options.lineColorsGutter
|
|
85
|
+
this._lineColorsContent = options.lineColorsContent
|
|
86
|
+
this._lineSigns = options.lineSigns
|
|
87
|
+
this._lineNumberOffset = options.lineNumberOffset
|
|
88
|
+
this._hideLineNumbers = options.hideLineNumbers
|
|
89
|
+
this._lineNumbers = options.lineNumbers ?? new Map()
|
|
90
|
+
this._lastKnownLineCount = this.target.virtualLineCount
|
|
91
|
+
this._lastKnownScrollY = this.target.scrollY
|
|
92
|
+
this.calculateSignWidths()
|
|
93
|
+
this.setupMeasureFunc()
|
|
94
|
+
|
|
95
|
+
// Use lifecycle pass to detect line count changes BEFORE layout
|
|
96
|
+
this.onLifecyclePass = () => {
|
|
97
|
+
const currentLineCount = this.target.virtualLineCount
|
|
98
|
+
if (currentLineCount !== this._lastKnownLineCount) {
|
|
99
|
+
this._lastKnownLineCount = currentLineCount
|
|
100
|
+
this.yogaNode.markDirty()
|
|
101
|
+
this.requestRender()
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private setupMeasureFunc(): void {
|
|
107
|
+
const measureFunc = (
|
|
108
|
+
width: number,
|
|
109
|
+
widthMode: MeasureMode,
|
|
110
|
+
height: number,
|
|
111
|
+
heightMode: MeasureMode,
|
|
112
|
+
): { width: number; height: number } => {
|
|
113
|
+
// Calculate the gutter width based on the target's line count
|
|
114
|
+
const gutterWidth = this.calculateWidth()
|
|
115
|
+
|
|
116
|
+
// Calculate gutter height based on target's actual virtual line count
|
|
117
|
+
// The gutter should match the height of the content it's numbering
|
|
118
|
+
const gutterHeight = this.target.virtualLineCount
|
|
119
|
+
|
|
120
|
+
// Return calculated dimensions based on content, not parent constraints
|
|
121
|
+
return {
|
|
122
|
+
width: gutterWidth,
|
|
123
|
+
height: gutterHeight,
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this.yogaNode.setMeasureFunc(measureFunc)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public remeasure(): void {
|
|
131
|
+
// Mark the yoga node as dirty to trigger re-measurement
|
|
132
|
+
this.yogaNode.markDirty()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public setLineNumberOffset(offset: number): void {
|
|
136
|
+
if (this._lineNumberOffset !== offset) {
|
|
137
|
+
this._lineNumberOffset = offset
|
|
138
|
+
this.yogaNode.markDirty()
|
|
139
|
+
this.requestRender()
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public setHideLineNumbers(hideLineNumbers: Set<number>): void {
|
|
144
|
+
this._hideLineNumbers = hideLineNumbers
|
|
145
|
+
this.yogaNode.markDirty()
|
|
146
|
+
this.requestRender()
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public setLineNumbers(lineNumbers: Map<number, number>): void {
|
|
150
|
+
this._lineNumbers = lineNumbers
|
|
151
|
+
this.yogaNode.markDirty()
|
|
152
|
+
this.requestRender()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private calculateSignWidths(): void {
|
|
156
|
+
this._maxBeforeWidth = 0
|
|
157
|
+
this._maxAfterWidth = 0
|
|
158
|
+
|
|
159
|
+
for (const sign of this._lineSigns.values()) {
|
|
160
|
+
if (sign.before) {
|
|
161
|
+
const width = Bun.stringWidth(sign.before)
|
|
162
|
+
this._maxBeforeWidth = Math.max(this._maxBeforeWidth, width)
|
|
163
|
+
}
|
|
164
|
+
if (sign.after) {
|
|
165
|
+
const width = Bun.stringWidth(sign.after)
|
|
166
|
+
this._maxAfterWidth = Math.max(this._maxAfterWidth, width)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private calculateWidth(): number {
|
|
172
|
+
const totalLines = this.target.virtualLineCount
|
|
173
|
+
|
|
174
|
+
// Find max line number, considering both calculated and custom line numbers
|
|
175
|
+
let maxLineNumber = totalLines + this._lineNumberOffset
|
|
176
|
+
if (this._lineNumbers.size > 0) {
|
|
177
|
+
for (const customLineNum of this._lineNumbers.values()) {
|
|
178
|
+
maxLineNumber = Math.max(maxLineNumber, customLineNum)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const digits = maxLineNumber > 0 ? Math.floor(Math.log10(maxLineNumber)) + 1 : 1
|
|
183
|
+
const baseWidth = Math.max(this._minWidth, digits + this._paddingRight + 1) // +1 for left padding
|
|
184
|
+
return baseWidth + this._maxBeforeWidth + this._maxAfterWidth
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public setLineColors(lineColorsGutter: Map<number, RGBA>, lineColorsContent: Map<number, RGBA>): void {
|
|
188
|
+
this._lineColorsGutter = lineColorsGutter
|
|
189
|
+
this._lineColorsContent = lineColorsContent
|
|
190
|
+
this.requestRender()
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
public get fg(): RGBA {
|
|
194
|
+
return this._fg
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public setFg(fg: RGBA): void {
|
|
198
|
+
if (this._fg !== fg) {
|
|
199
|
+
this._fg = fg
|
|
200
|
+
this.requestRender()
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public get bg(): RGBA {
|
|
205
|
+
return this._bg
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public setBg(bg: RGBA): void {
|
|
209
|
+
if (this._bg !== bg) {
|
|
210
|
+
this._bg = bg
|
|
211
|
+
this.requestRender()
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public getLineColors(): { gutter: Map<number, RGBA>; content: Map<number, RGBA> } {
|
|
216
|
+
return {
|
|
217
|
+
gutter: this._lineColorsGutter,
|
|
218
|
+
content: this._lineColorsContent,
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public setLineSigns(lineSigns: Map<number, LineSign>): void {
|
|
223
|
+
const oldMaxBefore = this._maxBeforeWidth
|
|
224
|
+
const oldMaxAfter = this._maxAfterWidth
|
|
225
|
+
|
|
226
|
+
this._lineSigns = lineSigns
|
|
227
|
+
this.calculateSignWidths()
|
|
228
|
+
|
|
229
|
+
// Mark dirty if sign widths changed - this will trigger remeasure
|
|
230
|
+
if (this._maxBeforeWidth !== oldMaxBefore || this._maxAfterWidth !== oldMaxAfter) {
|
|
231
|
+
this.yogaNode.markDirty()
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Always request render since signs themselves may have changed
|
|
235
|
+
this.requestRender()
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public getLineSigns(): Map<number, LineSign> {
|
|
239
|
+
return this._lineSigns
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
protected override renderSelf(buffer: OptimizedBuffer): void {
|
|
243
|
+
// For buffered rendering, only re-render when dirty OR when scroll position changed
|
|
244
|
+
const currentScrollY = this.target.scrollY
|
|
245
|
+
const scrollChanged = currentScrollY !== this._lastKnownScrollY
|
|
246
|
+
|
|
247
|
+
if (this.buffered && !this.isDirty && !scrollChanged) {
|
|
248
|
+
return
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
this._lastKnownScrollY = currentScrollY
|
|
252
|
+
this.refreshFrameBuffer(buffer)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private refreshFrameBuffer(buffer: OptimizedBuffer): void {
|
|
256
|
+
const startX = this.buffered ? 0 : this.x
|
|
257
|
+
const startY = this.buffered ? 0 : this.y
|
|
258
|
+
|
|
259
|
+
if (this.buffered) {
|
|
260
|
+
buffer.clear(this._bg)
|
|
261
|
+
} else if (this._bg.a > 0) {
|
|
262
|
+
// Fill background if not buffered and opaque (if buffered, clear handles it)
|
|
263
|
+
// Note: this.height might be determined by parent (flex stretch)
|
|
264
|
+
buffer.fillRect(startX, startY, this.width, this.height, this._bg)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const lineInfo = this.target.lineInfo
|
|
268
|
+
if (!lineInfo || !lineInfo.lineSources) return
|
|
269
|
+
|
|
270
|
+
const sources = lineInfo.lineSources
|
|
271
|
+
let lastSource = -1
|
|
272
|
+
|
|
273
|
+
// lineSources contains the logical line index for each visual line
|
|
274
|
+
// We start iterating from the scroll offset (first visible line)
|
|
275
|
+
const startLine = this.target.scrollY
|
|
276
|
+
|
|
277
|
+
// If scrolled past content (shouldn't happen normally but good to be safe)
|
|
278
|
+
if (startLine >= sources.length) return
|
|
279
|
+
|
|
280
|
+
// Get the logical line index of the line *before* the first visible line
|
|
281
|
+
// This helps determine if the first visible line is a wrapped continuation
|
|
282
|
+
lastSource = startLine > 0 ? sources[startLine - 1] : -1
|
|
283
|
+
|
|
284
|
+
for (let i = 0; i < this.height; i++) {
|
|
285
|
+
const visualLineIndex = startLine + i
|
|
286
|
+
if (visualLineIndex >= sources.length) break
|
|
287
|
+
|
|
288
|
+
const logicalLine = sources[visualLineIndex]
|
|
289
|
+
const lineBg = this._lineColorsGutter.get(logicalLine) ?? this._bg
|
|
290
|
+
|
|
291
|
+
// Fill background for this line if it has a custom color
|
|
292
|
+
if (lineBg !== this._bg) {
|
|
293
|
+
buffer.fillRect(startX, startY + i, this.width, 1, lineBg)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Draw line number only for the first visual line of a logical line (wrapping)
|
|
297
|
+
if (logicalLine === lastSource) {
|
|
298
|
+
// Continuation line, maybe draw a dot or nothing
|
|
299
|
+
} else {
|
|
300
|
+
let currentX = startX
|
|
301
|
+
|
|
302
|
+
// Draw 'before' sign if present
|
|
303
|
+
const sign = this._lineSigns.get(logicalLine)
|
|
304
|
+
if (sign?.before) {
|
|
305
|
+
const beforeWidth = Bun.stringWidth(sign.before)
|
|
306
|
+
// Pad to max before width for alignment
|
|
307
|
+
const padding = this._maxBeforeWidth - beforeWidth
|
|
308
|
+
currentX += padding
|
|
309
|
+
const beforeColor = sign.beforeColor ? parseColor(sign.beforeColor) : this._fg
|
|
310
|
+
buffer.drawText(sign.before, currentX, startY + i, beforeColor, lineBg)
|
|
311
|
+
currentX += beforeWidth
|
|
312
|
+
} else if (this._maxBeforeWidth > 0) {
|
|
313
|
+
currentX += this._maxBeforeWidth
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Draw line number (right-aligned in its space with left padding of 1)
|
|
317
|
+
if (!this._hideLineNumbers.has(logicalLine)) {
|
|
318
|
+
// Use custom line number if provided, otherwise use calculated line number
|
|
319
|
+
const customLineNum = this._lineNumbers.get(logicalLine)
|
|
320
|
+
const lineNum = customLineNum !== undefined ? customLineNum : logicalLine + 1 + this._lineNumberOffset
|
|
321
|
+
const lineNumStr = lineNum.toString()
|
|
322
|
+
const lineNumWidth = lineNumStr.length
|
|
323
|
+
const availableSpace = this.width - this._maxBeforeWidth - this._maxAfterWidth - this._paddingRight
|
|
324
|
+
const lineNumX = startX + this._maxBeforeWidth + 1 + availableSpace - lineNumWidth - 1
|
|
325
|
+
|
|
326
|
+
if (lineNumX >= startX + this._maxBeforeWidth + 1) {
|
|
327
|
+
buffer.drawText(lineNumStr, lineNumX, startY + i, this._fg, lineBg)
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Draw 'after' sign if present
|
|
332
|
+
if (sign?.after) {
|
|
333
|
+
const afterX = startX + this.width - this._paddingRight - this._maxAfterWidth
|
|
334
|
+
const afterColor = sign.afterColor ? parseColor(sign.afterColor) : this._fg
|
|
335
|
+
buffer.drawText(sign.after, afterX, startY + i, afterColor, lineBg)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
lastSource = logicalLine
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Helper function to darken an RGBA color by 20%
|
|
345
|
+
function darkenColor(color: RGBA): RGBA {
|
|
346
|
+
return RGBA.fromValues(color.r * 0.8, color.g * 0.8, color.b * 0.8, color.a)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export class LineNumberRenderable extends Renderable {
|
|
350
|
+
private gutter: GutterRenderable | null = null
|
|
351
|
+
private target: (Renderable & LineInfoProvider) | null = null
|
|
352
|
+
private _lineColorsGutter: Map<number, RGBA>
|
|
353
|
+
private _lineColorsContent: Map<number, RGBA>
|
|
354
|
+
private _lineSigns: Map<number, LineSign>
|
|
355
|
+
private _fg: RGBA
|
|
356
|
+
private _bg: RGBA
|
|
357
|
+
private _minWidth: number
|
|
358
|
+
private _paddingRight: number
|
|
359
|
+
private _lineNumberOffset: number
|
|
360
|
+
private _hideLineNumbers: Set<number>
|
|
361
|
+
private _lineNumbers: Map<number, number>
|
|
362
|
+
private _isDestroying: boolean = false
|
|
363
|
+
private handleLineInfoChange = (): void => {
|
|
364
|
+
// When line info changes in the target, remeasure the gutter
|
|
365
|
+
this.gutter?.remeasure()
|
|
366
|
+
this.requestRender()
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
private parseLineColor(line: number, color: string | RGBA | LineColorConfig): void {
|
|
370
|
+
if (typeof color === "object" && "gutter" in color) {
|
|
371
|
+
// LineColorConfig format
|
|
372
|
+
const config = color as LineColorConfig
|
|
373
|
+
if (config.gutter) {
|
|
374
|
+
this._lineColorsGutter.set(line, parseColor(config.gutter))
|
|
375
|
+
}
|
|
376
|
+
if (config.content) {
|
|
377
|
+
this._lineColorsContent.set(line, parseColor(config.content))
|
|
378
|
+
} else if (config.gutter) {
|
|
379
|
+
// If only gutter is specified, use a darker version for content
|
|
380
|
+
this._lineColorsContent.set(line, darkenColor(parseColor(config.gutter)))
|
|
381
|
+
}
|
|
382
|
+
} else {
|
|
383
|
+
// Simple format - same color for both, but content is darker
|
|
384
|
+
const parsedColor = parseColor(color as string | RGBA)
|
|
385
|
+
this._lineColorsGutter.set(line, parsedColor)
|
|
386
|
+
this._lineColorsContent.set(line, darkenColor(parsedColor))
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
constructor(ctx: RenderContext, options: LineNumberOptions) {
|
|
391
|
+
super(ctx, {
|
|
392
|
+
...options,
|
|
393
|
+
flexDirection: "row",
|
|
394
|
+
// CRITICAL:
|
|
395
|
+
// By forcing height=auto, we ensure the parent box properly accounts for our full height.
|
|
396
|
+
height: "auto",
|
|
397
|
+
})
|
|
398
|
+
|
|
399
|
+
this._fg = parseColor(options.fg ?? DEFAULT_GUTTER_FG)
|
|
400
|
+
this._bg = parseColor(options.bg ?? DEFAULT_GUTTER_BG)
|
|
401
|
+
this._minWidth = options.minWidth ?? 3
|
|
402
|
+
this._paddingRight = options.paddingRight ?? 1
|
|
403
|
+
this._lineNumberOffset = options.lineNumberOffset ?? 0
|
|
404
|
+
this._hideLineNumbers = options.hideLineNumbers ?? new Set()
|
|
405
|
+
this._lineNumbers = options.lineNumbers ?? new Map()
|
|
406
|
+
|
|
407
|
+
this._lineColorsGutter = new Map<number, RGBA>()
|
|
408
|
+
this._lineColorsContent = new Map<number, RGBA>()
|
|
409
|
+
if (options.lineColors) {
|
|
410
|
+
for (const [line, color] of options.lineColors) {
|
|
411
|
+
this.parseLineColor(line, color)
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
this._lineSigns = new Map<number, LineSign>()
|
|
416
|
+
if (options.lineSigns) {
|
|
417
|
+
for (const [line, sign] of options.lineSigns) {
|
|
418
|
+
this._lineSigns.set(line, sign)
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// If target is provided in constructor, set it up immediately
|
|
423
|
+
if (options.target) {
|
|
424
|
+
this.setTarget(options.target)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
private setTarget(target: Renderable & LineInfoProvider): void {
|
|
429
|
+
if (this.target === target) return
|
|
430
|
+
|
|
431
|
+
if (this.target) {
|
|
432
|
+
// Remove event listener from old target
|
|
433
|
+
this.target.off("line-info-change", this.handleLineInfoChange)
|
|
434
|
+
super.remove(this.target.id)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (this.gutter) {
|
|
438
|
+
super.remove(this.gutter.id)
|
|
439
|
+
this.gutter = null
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
this.target = target
|
|
443
|
+
|
|
444
|
+
// Listen for line info changes from target
|
|
445
|
+
this.target.on("line-info-change", this.handleLineInfoChange)
|
|
446
|
+
|
|
447
|
+
this.gutter = new GutterRenderable(this.ctx, this.target, {
|
|
448
|
+
fg: this._fg,
|
|
449
|
+
bg: this._bg,
|
|
450
|
+
minWidth: this._minWidth,
|
|
451
|
+
paddingRight: this._paddingRight,
|
|
452
|
+
lineColorsGutter: this._lineColorsGutter,
|
|
453
|
+
lineColorsContent: this._lineColorsContent,
|
|
454
|
+
lineSigns: this._lineSigns,
|
|
455
|
+
lineNumberOffset: this._lineNumberOffset,
|
|
456
|
+
hideLineNumbers: this._hideLineNumbers,
|
|
457
|
+
lineNumbers: this._lineNumbers,
|
|
458
|
+
id: this.id ? `${this.id}-gutter` : undefined,
|
|
459
|
+
buffered: true,
|
|
460
|
+
})
|
|
461
|
+
|
|
462
|
+
super.add(this.gutter)
|
|
463
|
+
super.add(this.target)
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Override add to intercept and set as target if it's a LineInfoProvider
|
|
467
|
+
public override add(child: Renderable): number {
|
|
468
|
+
// If this is a LineInfoProvider and we don't have a target yet, set it
|
|
469
|
+
if (
|
|
470
|
+
!this.target &&
|
|
471
|
+
"lineInfo" in child &&
|
|
472
|
+
"lineCount" in child &&
|
|
473
|
+
"virtualLineCount" in child &&
|
|
474
|
+
"scrollY" in child
|
|
475
|
+
) {
|
|
476
|
+
this.setTarget(child as Renderable & LineInfoProvider)
|
|
477
|
+
return this.getChildrenCount() - 1
|
|
478
|
+
}
|
|
479
|
+
// Otherwise ignore - SolidJS may try to add layout slots or other helpers
|
|
480
|
+
return -1
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Override remove to prevent removing gutter/target directly
|
|
484
|
+
public override remove(id: string): void {
|
|
485
|
+
if (this._isDestroying) {
|
|
486
|
+
super.remove(id)
|
|
487
|
+
return
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (this.gutter && id === this.gutter.id) {
|
|
491
|
+
throw new Error("LineNumberRenderable: Cannot remove gutter directly.")
|
|
492
|
+
}
|
|
493
|
+
if (this.target && id === this.target.id) {
|
|
494
|
+
throw new Error("LineNumberRenderable: Cannot remove target directly. Use clearTarget() instead.")
|
|
495
|
+
}
|
|
496
|
+
super.remove(id)
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Override destroyRecursively to properly clean up internal components
|
|
500
|
+
public override destroyRecursively(): void {
|
|
501
|
+
this._isDestroying = true
|
|
502
|
+
|
|
503
|
+
if (this.target) {
|
|
504
|
+
this.target.off("line-info-change", this.handleLineInfoChange)
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
super.destroyRecursively()
|
|
508
|
+
|
|
509
|
+
this.gutter = null
|
|
510
|
+
this.target = null
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
public clearTarget(): void {
|
|
514
|
+
if (this.target) {
|
|
515
|
+
this.target.off("line-info-change", this.handleLineInfoChange)
|
|
516
|
+
super.remove(this.target.id)
|
|
517
|
+
this.target = null
|
|
518
|
+
}
|
|
519
|
+
if (this.gutter) {
|
|
520
|
+
super.remove(this.gutter.id)
|
|
521
|
+
this.gutter = null
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
protected override renderSelf(buffer: OptimizedBuffer): void {
|
|
526
|
+
// Draw full-width line backgrounds before children render
|
|
527
|
+
if (!this.target || !this.gutter) return
|
|
528
|
+
|
|
529
|
+
const lineInfo = this.target.lineInfo
|
|
530
|
+
if (!lineInfo || !lineInfo.lineSources) return
|
|
531
|
+
|
|
532
|
+
const sources = lineInfo.lineSources
|
|
533
|
+
const startLine = this.target.scrollY
|
|
534
|
+
|
|
535
|
+
if (startLine >= sources.length) return
|
|
536
|
+
|
|
537
|
+
// Calculate the area to fill: from after the gutter (if visible) to the end of our width
|
|
538
|
+
const gutterWidth = this.gutter.visible ? this.gutter.width : 0
|
|
539
|
+
const contentWidth = this.width - gutterWidth
|
|
540
|
+
|
|
541
|
+
// Draw full-width background colors for lines with custom colors
|
|
542
|
+
for (let i = 0; i < this.height; i++) {
|
|
543
|
+
const visualLineIndex = startLine + i
|
|
544
|
+
if (visualLineIndex >= sources.length) break
|
|
545
|
+
|
|
546
|
+
const logicalLine = sources[visualLineIndex]
|
|
547
|
+
const lineBg = this._lineColorsContent.get(logicalLine)
|
|
548
|
+
|
|
549
|
+
if (lineBg) {
|
|
550
|
+
// Fill from after gutter to the end of the LineNumberRenderable
|
|
551
|
+
buffer.fillRect(this.x + gutterWidth, this.y + i, contentWidth, 1, lineBg)
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
public set showLineNumbers(value: boolean) {
|
|
557
|
+
if (this.gutter) {
|
|
558
|
+
this.gutter.visible = value
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
public get showLineNumbers(): boolean {
|
|
563
|
+
return this.gutter?.visible ?? false
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
public get fg(): RGBA {
|
|
567
|
+
return this._fg
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
public set fg(value: string | RGBA | undefined) {
|
|
571
|
+
const parsed = parseColor(value ?? DEFAULT_GUTTER_FG)
|
|
572
|
+
if (this._fg !== parsed) {
|
|
573
|
+
this._fg = parsed
|
|
574
|
+
this.gutter?.setFg(parsed)
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
public get bg(): RGBA {
|
|
579
|
+
return this._bg
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
public set bg(value: string | RGBA | undefined) {
|
|
583
|
+
const parsed = parseColor(value ?? DEFAULT_GUTTER_BG)
|
|
584
|
+
if (this._bg !== parsed) {
|
|
585
|
+
this._bg = parsed
|
|
586
|
+
this.gutter?.setBg(parsed)
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
public setLineColor(line: number, color: string | RGBA | LineColorConfig): void {
|
|
591
|
+
this.parseLineColor(line, color)
|
|
592
|
+
// Update gutter if it exists
|
|
593
|
+
if (this.gutter) {
|
|
594
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
public clearLineColor(line: number): void {
|
|
599
|
+
this._lineColorsGutter.delete(line)
|
|
600
|
+
this._lineColorsContent.delete(line)
|
|
601
|
+
if (this.gutter) {
|
|
602
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
public clearAllLineColors(): void {
|
|
607
|
+
this._lineColorsGutter.clear()
|
|
608
|
+
this._lineColorsContent.clear()
|
|
609
|
+
if (this.gutter) {
|
|
610
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
public setLineColors(lineColors: Map<number, string | RGBA | LineColorConfig>): void {
|
|
615
|
+
this._lineColorsGutter.clear()
|
|
616
|
+
this._lineColorsContent.clear()
|
|
617
|
+
for (const [line, color] of lineColors) {
|
|
618
|
+
this.parseLineColor(line, color)
|
|
619
|
+
}
|
|
620
|
+
// Update gutter once after all colors are set
|
|
621
|
+
if (this.gutter) {
|
|
622
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
public getLineColors(): { gutter: Map<number, RGBA>; content: Map<number, RGBA> } {
|
|
627
|
+
return {
|
|
628
|
+
gutter: this._lineColorsGutter,
|
|
629
|
+
content: this._lineColorsContent,
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
public setLineSign(line: number, sign: LineSign): void {
|
|
634
|
+
this._lineSigns.set(line, sign)
|
|
635
|
+
if (this.gutter) {
|
|
636
|
+
this.gutter.setLineSigns(this._lineSigns)
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
public clearLineSign(line: number): void {
|
|
641
|
+
this._lineSigns.delete(line)
|
|
642
|
+
if (this.gutter) {
|
|
643
|
+
this.gutter.setLineSigns(this._lineSigns)
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
public clearAllLineSigns(): void {
|
|
648
|
+
this._lineSigns.clear()
|
|
649
|
+
if (this.gutter) {
|
|
650
|
+
this.gutter.setLineSigns(this._lineSigns)
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
public setLineSigns(lineSigns: Map<number, LineSign>): void {
|
|
655
|
+
this._lineSigns.clear()
|
|
656
|
+
for (const [line, sign] of lineSigns) {
|
|
657
|
+
this._lineSigns.set(line, sign)
|
|
658
|
+
}
|
|
659
|
+
if (this.gutter) {
|
|
660
|
+
this.gutter.setLineSigns(this._lineSigns)
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
public getLineSigns(): Map<number, LineSign> {
|
|
665
|
+
return this._lineSigns
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
public set lineNumberOffset(value: number) {
|
|
669
|
+
if (this._lineNumberOffset !== value) {
|
|
670
|
+
this._lineNumberOffset = value
|
|
671
|
+
if (this.gutter) {
|
|
672
|
+
// Update the gutter's offset using its setter
|
|
673
|
+
this.gutter.setLineNumberOffset(value)
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
public get lineNumberOffset(): number {
|
|
679
|
+
return this._lineNumberOffset
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
public setHideLineNumbers(hideLineNumbers: Set<number>): void {
|
|
683
|
+
this._hideLineNumbers = hideLineNumbers
|
|
684
|
+
if (this.gutter) {
|
|
685
|
+
// Update the gutter's hideLineNumbers using its setter
|
|
686
|
+
this.gutter.setHideLineNumbers(hideLineNumbers)
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
public getHideLineNumbers(): Set<number> {
|
|
691
|
+
return this._hideLineNumbers
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
public setLineNumbers(lineNumbers: Map<number, number>): void {
|
|
695
|
+
this._lineNumbers = lineNumbers
|
|
696
|
+
if (this.gutter) {
|
|
697
|
+
// Update the gutter's lineNumbers using its setter
|
|
698
|
+
this.gutter.setLineNumbers(lineNumbers)
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
public getLineNumbers(): Map<number, number> {
|
|
703
|
+
return this._lineNumbers
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
public highlightLines(startLine: number, endLine: number, color: string | RGBA | LineColorConfig): void {
|
|
707
|
+
for (let i = startLine; i <= endLine; i++) {
|
|
708
|
+
this.parseLineColor(i, color)
|
|
709
|
+
}
|
|
710
|
+
if (this.gutter) {
|
|
711
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
public clearHighlightLines(startLine: number, endLine: number): void {
|
|
716
|
+
for (let i = startLine; i <= endLine; i++) {
|
|
717
|
+
this._lineColorsGutter.delete(i)
|
|
718
|
+
this._lineColorsContent.delete(i)
|
|
719
|
+
}
|
|
720
|
+
if (this.gutter) {
|
|
721
|
+
this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
}
|