@fairyhunter13/opentui-core 0.1.91 → 0.1.94
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/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +34042 -0
- package/3d.js.map +155 -0
- package/LICENSE +21 -0
- package/NativeSpanFeed.d.ts +41 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/buffer.d.ts +107 -0
- package/console.d.ts +143 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-e6ec7apq.js +18415 -0
- package/index-e6ec7apq.js.map +64 -0
- package/index-h066zmrb.js +12619 -0
- package/index-h066zmrb.js.map +43 -0
- package/index-ynzawt3n.js +113 -0
- package/index-ynzawt3n.js.map +10 -0
- package/index.d.ts +21 -0
- package/index.js +430 -0
- package/index.js.map +9 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +25 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +49 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/clock.d.ts +15 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/detect-links.d.ts +6 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +21 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +30 -0
- package/lib/paste.d.ts +7 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-parser.d.ts +76 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +50 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +38 -0
- package/lib/tree-sitter/resolve-ft.d.ts +2 -0
- package/lib/tree-sitter/types.d.ts +81 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +51 -63
- package/parser.worker.js +869 -0
- package/parser.worker.js.map +12 -0
- package/plugins/core-slot.d.ts +72 -0
- package/plugins/registry.d.ts +38 -0
- package/plugins/types.d.ts +34 -0
- package/post/filters.d.ts +105 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +72 -0
- package/renderables/Code.d.ts +78 -0
- package/renderables/Diff.d.ts +142 -0
- package/renderables/EditBufferRenderable.d.ts +162 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +67 -0
- package/renderables/LineNumberRenderable.d.ts +74 -0
- package/renderables/Markdown.d.ts +173 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +124 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +44 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +105 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/TextTable.d.ts +140 -0
- package/renderables/Textarea.d.ts +114 -0
- package/renderables/TimeToFirstDraw.d.ts +24 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +22 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +388 -0
- package/runtime-plugin-support.d.ts +3 -0
- package/runtime-plugin-support.js +29 -0
- package/runtime-plugin-support.js.map +10 -0
- package/runtime-plugin.d.ts +11 -0
- package/runtime-plugin.js +16 -0
- package/runtime-plugin.js.map +9 -0
- package/syntax-style.d.ts +54 -0
- package/testing/manual-clock.d.ts +16 -0
- package/testing/mock-keys.d.ts +81 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +675 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +131 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +155 -0
- package/zig.d.ts +351 -0
- package/dev/keypress-debug-renderer.ts +0 -148
- package/dev/keypress-debug.ts +0 -43
- package/dev/print-env-vars.ts +0 -32
- package/dev/test-tmux-graphics-334.sh +0 -68
- package/dev/thai-debug-test.ts +0 -68
- package/docs/development.md +0 -141
- package/docs/env-vars.md +0 -140
- package/docs/getting-started.md +0 -353
- package/docs/renderables-vs-constructs.md +0 -159
- package/docs/tree-sitter.md +0 -311
- package/scripts/build.ts +0 -400
- package/scripts/publish.ts +0 -60
- package/src/3d/SpriteResourceManager.ts +0 -286
- package/src/3d/SpriteUtils.ts +0 -71
- package/src/3d/TextureUtils.ts +0 -196
- package/src/3d/ThreeRenderable.ts +0 -197
- package/src/3d/WGPURenderer.ts +0 -294
- package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
- package/src/3d/animation/SpriteAnimator.ts +0 -633
- package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
- package/src/3d/canvas.ts +0 -464
- package/src/3d/index.ts +0 -12
- package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
- package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
- package/src/3d/physics/physics-interface.ts +0 -31
- package/src/3d/shaders/supersampling.wgsl +0 -201
- package/src/3d.ts +0 -3
- package/src/NativeSpanFeed.ts +0 -300
- package/src/Renderable.ts +0 -1698
- package/src/__snapshots__/buffer.test.ts.snap +0 -28
- package/src/animation/Timeline.test.ts +0 -2709
- package/src/animation/Timeline.ts +0 -598
- package/src/ansi.ts +0 -18
- package/src/benchmark/latest-all-bench-run.json +0 -707
- package/src/benchmark/latest-async-bench-run.json +0 -336
- package/src/benchmark/latest-default-bench-run.json +0 -657
- package/src/benchmark/latest-large-bench-run.json +0 -707
- package/src/benchmark/latest-quick-bench-run.json +0 -207
- package/src/benchmark/markdown-benchmark.ts +0 -1804
- package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
- package/src/benchmark/native-span-feed-benchmark.md +0 -56
- package/src/benchmark/native-span-feed-benchmark.ts +0 -596
- package/src/benchmark/native-span-feed-compare.ts +0 -280
- package/src/benchmark/renderer-benchmark.ts +0 -754
- package/src/benchmark/text-table-benchmark.ts +0 -947
- package/src/buffer.test.ts +0 -291
- package/src/buffer.ts +0 -519
- package/src/console.test.ts +0 -612
- package/src/console.ts +0 -1255
- package/src/edit-buffer.test.ts +0 -1769
- package/src/edit-buffer.ts +0 -411
- package/src/editor-view.test.ts +0 -1032
- package/src/editor-view.ts +0 -284
- package/src/examples/ascii-font-selection-demo.ts +0 -245
- 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 +0 -1018
- 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 +0 -115
- package/src/examples/code-demo.ts +0 -584
- package/src/examples/console-demo.ts +0 -358
- package/src/examples/core-plugin-slots-demo.ts +0 -759
- package/src/examples/diff-demo.ts +0 -699
- package/src/examples/draggable-three-demo.ts +0 -259
- package/src/examples/editor-demo.ts +0 -322
- package/src/examples/extmarks-demo.ts +0 -204
- package/src/examples/focus-restore-demo.ts +0 -310
- package/src/examples/fonts.ts +0 -245
- package/src/examples/fractal-shader-demo.ts +0 -268
- package/src/examples/framebuffer-demo.ts +0 -674
- package/src/examples/full-unicode-demo.ts +0 -181
- package/src/examples/golden-star-demo.ts +0 -933
- package/src/examples/grayscale-buffer-demo.ts +0 -249
- package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
- package/src/examples/index.ts +0 -925
- package/src/examples/input-demo.ts +0 -377
- package/src/examples/input-select-layout-demo.ts +0 -425
- package/src/examples/install.sh +0 -143
- package/src/examples/keypress-debug-demo.ts +0 -452
- package/src/examples/lib/HexList.ts +0 -122
- package/src/examples/lib/PaletteGrid.ts +0 -125
- package/src/examples/lib/standalone-keys.ts +0 -25
- package/src/examples/lib/tab-controller.ts +0 -243
- package/src/examples/lights-phong-demo.ts +0 -290
- package/src/examples/link-demo.ts +0 -220
- package/src/examples/live-state-demo.ts +0 -480
- package/src/examples/markdown-demo.ts +0 -620
- package/src/examples/mouse-interaction-demo.ts +0 -428
- package/src/examples/nested-zindex-demo.ts +0 -357
- package/src/examples/opacity-example.ts +0 -235
- package/src/examples/opentui-demo.ts +0 -1057
- package/src/examples/physx-planck-2d-demo.ts +0 -507
- package/src/examples/physx-rapier-2d-demo.ts +0 -526
- package/src/examples/relative-positioning-demo.ts +0 -323
- package/src/examples/scroll-example.ts +0 -214
- package/src/examples/scrollbox-mouse-test.ts +0 -112
- package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
- package/src/examples/select-demo.ts +0 -237
- package/src/examples/shader-cube-demo.ts +0 -772
- package/src/examples/simple-layout-example.ts +0 -591
- package/src/examples/slider-demo.ts +0 -617
- package/src/examples/split-mode-demo.ts +0 -445
- package/src/examples/sprite-animation-demo.ts +0 -443
- package/src/examples/sprite-particle-generator-demo.ts +0 -486
- package/src/examples/static-sprite-demo.ts +0 -193
- package/src/examples/sticky-scroll-example.ts +0 -308
- package/src/examples/styled-text-demo.ts +0 -282
- package/src/examples/tab-select-demo.ts +0 -219
- package/src/examples/terminal-title.ts +0 -29
- package/src/examples/terminal.ts +0 -305
- package/src/examples/text-node-demo.ts +0 -416
- package/src/examples/text-selection-demo.ts +0 -377
- package/src/examples/text-table-demo.ts +0 -503
- package/src/examples/text-truncation-demo.ts +0 -481
- package/src/examples/text-wrap.ts +0 -757
- package/src/examples/texture-loading-demo.ts +0 -259
- package/src/examples/timeline-example.ts +0 -670
- package/src/examples/transparency-demo.ts +0 -241
- package/src/examples/vnode-composition-demo.ts +0 -404
- package/src/index.ts +0 -22
- package/src/lib/KeyHandler.integration.test.ts +0 -292
- package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
- package/src/lib/KeyHandler.test.ts +0 -662
- package/src/lib/KeyHandler.ts +0 -222
- package/src/lib/RGBA.test.ts +0 -984
- package/src/lib/RGBA.ts +0 -204
- package/src/lib/ascii.font.ts +0 -330
- package/src/lib/border.test.ts +0 -83
- package/src/lib/border.ts +0 -168
- package/src/lib/bunfs.test.ts +0 -27
- package/src/lib/bunfs.ts +0 -18
- package/src/lib/clipboard.test.ts +0 -41
- package/src/lib/clipboard.ts +0 -47
- package/src/lib/clock.ts +0 -31
- package/src/lib/data-paths.test.ts +0 -133
- package/src/lib/data-paths.ts +0 -109
- package/src/lib/debounce.ts +0 -106
- package/src/lib/detect-links.test.ts +0 -98
- package/src/lib/detect-links.ts +0 -56
- package/src/lib/env.test.ts +0 -228
- package/src/lib/env.ts +0 -209
- package/src/lib/extmarks-history.ts +0 -51
- package/src/lib/extmarks-multiwidth.test.ts +0 -322
- package/src/lib/extmarks.test.ts +0 -3457
- package/src/lib/extmarks.ts +0 -843
- package/src/lib/fonts/block.json +0 -405
- package/src/lib/fonts/grid.json +0 -265
- package/src/lib/fonts/huge.json +0 -741
- package/src/lib/fonts/pallet.json +0 -314
- package/src/lib/fonts/shade.json +0 -591
- package/src/lib/fonts/slick.json +0 -321
- package/src/lib/fonts/tiny.json +0 -69
- package/src/lib/hast-styled-text.ts +0 -59
- package/src/lib/index.ts +0 -21
- package/src/lib/keymapping.test.ts +0 -280
- package/src/lib/keymapping.ts +0 -87
- package/src/lib/objects-in-viewport.test.ts +0 -787
- package/src/lib/objects-in-viewport.ts +0 -153
- package/src/lib/output.capture.ts +0 -58
- package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
- package/src/lib/parse.keypress-kitty.test.ts +0 -663
- package/src/lib/parse.keypress-kitty.ts +0 -439
- package/src/lib/parse.keypress.test.ts +0 -1849
- package/src/lib/parse.keypress.ts +0 -397
- package/src/lib/parse.mouse.test.ts +0 -552
- package/src/lib/parse.mouse.ts +0 -232
- package/src/lib/paste.ts +0 -16
- package/src/lib/queue.ts +0 -65
- package/src/lib/renderable.validations.test.ts +0 -87
- package/src/lib/renderable.validations.ts +0 -83
- package/src/lib/scroll-acceleration.ts +0 -98
- package/src/lib/selection.ts +0 -240
- package/src/lib/singleton.ts +0 -28
- package/src/lib/stdin-parser.test.ts +0 -1676
- package/src/lib/stdin-parser.ts +0 -1248
- package/src/lib/styled-text.ts +0 -178
- package/src/lib/terminal-capability-detection.test.ts +0 -202
- package/src/lib/terminal-capability-detection.ts +0 -79
- package/src/lib/terminal-palette.test.ts +0 -878
- package/src/lib/terminal-palette.ts +0 -383
- package/src/lib/tree-sitter/assets/README.md +0 -118
- package/src/lib/tree-sitter/assets/update.ts +0 -331
- package/src/lib/tree-sitter/assets.d.ts +0 -9
- package/src/lib/tree-sitter/cache.test.ts +0 -270
- package/src/lib/tree-sitter/client.test.ts +0 -1061
- package/src/lib/tree-sitter/client.ts +0 -615
- package/src/lib/tree-sitter/default-parsers.ts +0 -80
- package/src/lib/tree-sitter/download-utils.ts +0 -148
- package/src/lib/tree-sitter/index.ts +0 -28
- package/src/lib/tree-sitter/parser.worker.ts +0 -1001
- package/src/lib/tree-sitter/parsers-config.ts +0 -75
- package/src/lib/tree-sitter/resolve-ft.ts +0 -62
- package/src/lib/tree-sitter/types.ts +0 -81
- package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
- package/src/lib/tree-sitter-styled-text.ts +0 -306
- package/src/lib/validate-dir-name.ts +0 -55
- package/src/lib/yoga.options.test.ts +0 -628
- package/src/lib/yoga.options.ts +0 -346
- package/src/plugins/core-slot.ts +0 -579
- package/src/plugins/registry.ts +0 -377
- package/src/plugins/types.ts +0 -46
- package/src/post/filters.ts +0 -888
- package/src/renderables/ASCIIFont.ts +0 -219
- package/src/renderables/Box.test.ts +0 -160
- package/src/renderables/Box.ts +0 -295
- package/src/renderables/Code.test.ts +0 -2062
- package/src/renderables/Code.ts +0 -357
- package/src/renderables/Diff.regression.test.ts +0 -226
- package/src/renderables/Diff.test.ts +0 -3027
- package/src/renderables/Diff.ts +0 -1209
- package/src/renderables/EditBufferRenderable.ts +0 -764
- package/src/renderables/FrameBuffer.ts +0 -47
- package/src/renderables/Input.test.ts +0 -1228
- package/src/renderables/Input.ts +0 -245
- package/src/renderables/LineNumberRenderable.ts +0 -675
- package/src/renderables/Markdown.ts +0 -1106
- package/src/renderables/ScrollBar.ts +0 -422
- package/src/renderables/ScrollBox.ts +0 -883
- package/src/renderables/Select.test.ts +0 -1010
- package/src/renderables/Select.ts +0 -523
- package/src/renderables/Slider.test.ts +0 -456
- package/src/renderables/Slider.ts +0 -347
- package/src/renderables/TabSelect.test.ts +0 -197
- package/src/renderables/TabSelect.ts +0 -455
- package/src/renderables/Text.selection-buffer.test.ts +0 -123
- package/src/renderables/Text.test.ts +0 -2660
- package/src/renderables/Text.ts +0 -147
- package/src/renderables/TextBufferRenderable.ts +0 -518
- package/src/renderables/TextNode.test.ts +0 -1058
- package/src/renderables/TextNode.ts +0 -325
- package/src/renderables/TextTable.test.ts +0 -1421
- package/src/renderables/TextTable.ts +0 -1344
- package/src/renderables/Textarea.ts +0 -732
- package/src/renderables/TimeToFirstDraw.ts +0 -89
- package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
- package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
- package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1787
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
- package/src/renderables/__tests__/Markdown.test.ts +0 -2287
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
- package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
- package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
- package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
- package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
- package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
- package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1864
- package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
- package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
- package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
- package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
- package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
- package/src/renderables/composition/README.md +0 -8
- package/src/renderables/composition/VRenderable.ts +0 -32
- package/src/renderables/composition/constructs.ts +0 -127
- package/src/renderables/composition/vnode.ts +0 -289
- package/src/renderables/index.ts +0 -22
- package/src/renderables/markdown-parser.ts +0 -66
- package/src/renderer.ts +0 -2363
- package/src/runtime-plugin-support.ts +0 -39
- package/src/runtime-plugin.ts +0 -144
- package/src/syntax-style.test.ts +0 -841
- package/src/syntax-style.ts +0 -264
- package/src/testing/README.md +0 -210
- package/src/testing/capture-spans.test.ts +0 -194
- package/src/testing/integration.test.ts +0 -276
- package/src/testing/manual-clock.ts +0 -106
- package/src/testing/mock-keys.test.ts +0 -1356
- package/src/testing/mock-keys.ts +0 -449
- package/src/testing/mock-mouse.test.ts +0 -218
- package/src/testing/mock-mouse.ts +0 -247
- package/src/testing/mock-tree-sitter-client.ts +0 -73
- package/src/testing/spy.ts +0 -13
- package/src/testing/test-recorder.test.ts +0 -415
- package/src/testing/test-recorder.ts +0 -145
- package/src/testing/test-renderer.ts +0 -116
- package/src/testing.ts +0 -7
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
- package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
- package/src/tests/allocator-stats.test.ts +0 -38
- package/src/tests/destroy-during-render.test.ts +0 -200
- package/src/tests/hover-cursor.test.ts +0 -98
- package/src/tests/native-span-feed-async.test.ts +0 -173
- package/src/tests/native-span-feed-close.test.ts +0 -120
- package/src/tests/native-span-feed-coverage.test.ts +0 -227
- package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
- package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
- package/src/tests/opacity.test.ts +0 -123
- package/src/tests/renderable.snapshot.test.ts +0 -524
- package/src/tests/renderable.test.ts +0 -1281
- package/src/tests/renderer.console-startup.test.ts +0 -65
- package/src/tests/renderer.control.test.ts +0 -364
- package/src/tests/renderer.core-slot-binding.test.ts +0 -952
- package/src/tests/renderer.cursor.test.ts +0 -26
- package/src/tests/renderer.destroy-during-render.test.ts +0 -110
- package/src/tests/renderer.focus-restore.test.ts +0 -228
- package/src/tests/renderer.focus.test.ts +0 -251
- package/src/tests/renderer.idle.test.ts +0 -219
- package/src/tests/renderer.input.test.ts +0 -2145
- package/src/tests/renderer.kitty-flags.test.ts +0 -195
- package/src/tests/renderer.mouse.test.ts +0 -1269
- package/src/tests/renderer.palette.test.ts +0 -629
- package/src/tests/renderer.selection.test.ts +0 -49
- package/src/tests/renderer.slot-registry.test.ts +0 -649
- package/src/tests/renderer.useMouse.test.ts +0 -50
- package/src/tests/runtime-plugin-support.fixture.ts +0 -11
- package/src/tests/runtime-plugin-support.test.ts +0 -28
- package/src/tests/runtime-plugin.fixture.ts +0 -40
- package/src/tests/runtime-plugin.test.ts +0 -190
- package/src/tests/scrollbox-culling-bug.test.ts +0 -114
- package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
- package/src/tests/scrollbox-hitgrid.test.ts +0 -909
- package/src/tests/scrollbox.test.ts +0 -1530
- package/src/tests/wrap-resize-perf.test.ts +0 -229
- package/src/tests/yoga-setters.test.ts +0 -921
- package/src/text-buffer-view.test.ts +0 -705
- package/src/text-buffer-view.ts +0 -189
- package/src/text-buffer.test.ts +0 -347
- package/src/text-buffer.ts +0 -250
- package/src/types.ts +0 -152
- package/src/utils.ts +0 -88
- package/src/zig/ansi.zig +0 -268
- package/src/zig/bench/README.md +0 -50
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
- package/src/zig/bench/edit-buffer_bench.zig +0 -476
- package/src/zig/bench/native-span-feed_bench.zig +0 -100
- package/src/zig/bench/rope-markers_bench.zig +0 -713
- package/src/zig/bench/rope_bench.zig +0 -514
- package/src/zig/bench/styled-text_bench.zig +0 -470
- package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
- package/src/zig/bench/text-buffer-view_bench.zig +0 -459
- package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
- package/src/zig/bench/utf8_bench.zig +0 -799
- package/src/zig/bench-utils.zig +0 -431
- package/src/zig/bench.zig +0 -217
- package/src/zig/buffer.zig +0 -2223
- package/src/zig/build.zig +0 -289
- package/src/zig/build.zig.zon +0 -16
- package/src/zig/edit-buffer.zig +0 -825
- package/src/zig/editor-view.zig +0 -802
- package/src/zig/event-bus.zig +0 -13
- package/src/zig/event-emitter.zig +0 -65
- package/src/zig/file-logger.zig +0 -92
- package/src/zig/grapheme.zig +0 -599
- package/src/zig/lib.zig +0 -1834
- package/src/zig/link.zig +0 -333
- package/src/zig/logger.zig +0 -43
- package/src/zig/mem-registry.zig +0 -125
- package/src/zig/native-span-feed-bench-lib.zig +0 -7
- package/src/zig/native-span-feed.zig +0 -708
- package/src/zig/renderer.zig +0 -1386
- package/src/zig/rope.zig +0 -1220
- package/src/zig/syntax-style.zig +0 -161
- package/src/zig/terminal.zig +0 -975
- package/src/zig/test.zig +0 -70
- package/src/zig/tests/README.md +0 -18
- package/src/zig/tests/buffer_test.zig +0 -2526
- package/src/zig/tests/edit-buffer-history_test.zig +0 -271
- package/src/zig/tests/edit-buffer_test.zig +0 -1689
- package/src/zig/tests/editor-view_test.zig +0 -3299
- package/src/zig/tests/event-emitter_test.zig +0 -249
- package/src/zig/tests/grapheme_test.zig +0 -1304
- package/src/zig/tests/link_test.zig +0 -190
- package/src/zig/tests/mem-registry_test.zig +0 -473
- package/src/zig/tests/memory_leak_regression_test.zig +0 -159
- package/src/zig/tests/native-span-feed_test.zig +0 -1264
- package/src/zig/tests/renderer_test.zig +0 -1010
- package/src/zig/tests/rope-nested_test.zig +0 -712
- package/src/zig/tests/rope_fuzz_test.zig +0 -238
- package/src/zig/tests/rope_test.zig +0 -2362
- package/src/zig/tests/segment-merge.test.zig +0 -148
- package/src/zig/tests/syntax-style_test.zig +0 -557
- package/src/zig/tests/terminal_test.zig +0 -719
- package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
- package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
- package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
- package/src/zig/tests/text-buffer-segment_test.zig +0 -320
- package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
- package/src/zig/tests/text-buffer-view_test.zig +0 -3649
- package/src/zig/tests/text-buffer_test.zig +0 -2191
- package/src/zig/tests/unicode-width-map.zon +0 -3909
- package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
- package/src/zig/tests/utf8_test.zig +0 -4057
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
- package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
- package/src/zig/tests/word-wrap-editing_test.zig +0 -498
- package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
- package/src/zig/text-buffer-iterators.zig +0 -499
- package/src/zig/text-buffer-segment.zig +0 -404
- package/src/zig/text-buffer-view.zig +0 -1371
- package/src/zig/text-buffer.zig +0 -1180
- package/src/zig/utf8.zig +0 -1948
- package/src/zig/utils.zig +0 -9
- package/src/zig-structs.ts +0 -261
- package/src/zig.ts +0 -3843
- package/tsconfig.build.json +0 -22
- package/tsconfig.json +0 -28
- /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
package/src/lib/styled-text.ts
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import type { TextRenderable } from "../renderables/Text.js"
|
|
2
|
-
import type { TextBuffer, TextChunk } from "../text-buffer.js"
|
|
3
|
-
import { createTextAttributes } from "../utils.js"
|
|
4
|
-
import { parseColor, type ColorInput } from "./RGBA.js"
|
|
5
|
-
|
|
6
|
-
const BrandedStyledText: unique symbol = Symbol.for("@fairyhunter13/opentui-core/StyledText")
|
|
7
|
-
|
|
8
|
-
export type Color = ColorInput
|
|
9
|
-
|
|
10
|
-
export interface StyleAttrs {
|
|
11
|
-
fg?: Color
|
|
12
|
-
bg?: Color
|
|
13
|
-
bold?: boolean
|
|
14
|
-
italic?: boolean
|
|
15
|
-
underline?: boolean
|
|
16
|
-
strikethrough?: boolean
|
|
17
|
-
dim?: boolean
|
|
18
|
-
reverse?: boolean
|
|
19
|
-
blink?: boolean
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function isStyledText(obj: any): obj is StyledText {
|
|
23
|
-
return obj && obj[BrandedStyledText]
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class StyledText {
|
|
27
|
-
[BrandedStyledText] = true
|
|
28
|
-
|
|
29
|
-
public chunks: TextChunk[]
|
|
30
|
-
|
|
31
|
-
constructor(chunks: TextChunk[]) {
|
|
32
|
-
this.chunks = chunks
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function stringToStyledText(content: string): StyledText {
|
|
37
|
-
const chunk = {
|
|
38
|
-
__isChunk: true as const,
|
|
39
|
-
text: content,
|
|
40
|
-
}
|
|
41
|
-
return new StyledText([chunk])
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export type StylableInput = string | number | boolean | TextChunk
|
|
45
|
-
|
|
46
|
-
function applyStyle(input: StylableInput, style: StyleAttrs): TextChunk {
|
|
47
|
-
if (typeof input === "object" && "__isChunk" in input) {
|
|
48
|
-
const existingChunk = input as TextChunk
|
|
49
|
-
|
|
50
|
-
const fg = style.fg ? parseColor(style.fg) : existingChunk.fg
|
|
51
|
-
const bg = style.bg ? parseColor(style.bg) : existingChunk.bg
|
|
52
|
-
|
|
53
|
-
const newAttrs = createTextAttributes(style)
|
|
54
|
-
const mergedAttrs = existingChunk.attributes ? existingChunk.attributes | newAttrs : newAttrs
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
__isChunk: true,
|
|
58
|
-
text: existingChunk.text,
|
|
59
|
-
fg,
|
|
60
|
-
bg,
|
|
61
|
-
attributes: mergedAttrs,
|
|
62
|
-
link: existingChunk.link,
|
|
63
|
-
}
|
|
64
|
-
} else {
|
|
65
|
-
const plainTextStr = String(input)
|
|
66
|
-
const fg = style.fg ? parseColor(style.fg) : undefined
|
|
67
|
-
const bg = style.bg ? parseColor(style.bg) : undefined
|
|
68
|
-
const attributes = createTextAttributes(style)
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
__isChunk: true,
|
|
72
|
-
text: plainTextStr,
|
|
73
|
-
fg,
|
|
74
|
-
bg,
|
|
75
|
-
attributes,
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Color functions
|
|
81
|
-
export const black = (input: StylableInput): TextChunk => applyStyle(input, { fg: "black" })
|
|
82
|
-
export const red = (input: StylableInput): TextChunk => applyStyle(input, { fg: "red" })
|
|
83
|
-
export const green = (input: StylableInput): TextChunk => applyStyle(input, { fg: "green" })
|
|
84
|
-
export const yellow = (input: StylableInput): TextChunk => applyStyle(input, { fg: "yellow" })
|
|
85
|
-
export const blue = (input: StylableInput): TextChunk => applyStyle(input, { fg: "blue" })
|
|
86
|
-
export const magenta = (input: StylableInput): TextChunk => applyStyle(input, { fg: "magenta" })
|
|
87
|
-
export const cyan = (input: StylableInput): TextChunk => applyStyle(input, { fg: "cyan" })
|
|
88
|
-
export const white = (input: StylableInput): TextChunk => applyStyle(input, { fg: "white" })
|
|
89
|
-
|
|
90
|
-
// Bright color functions
|
|
91
|
-
export const brightBlack = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightBlack" })
|
|
92
|
-
export const brightRed = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightRed" })
|
|
93
|
-
export const brightGreen = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightGreen" })
|
|
94
|
-
export const brightYellow = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightYellow" })
|
|
95
|
-
export const brightBlue = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightBlue" })
|
|
96
|
-
export const brightMagenta = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightMagenta" })
|
|
97
|
-
export const brightCyan = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightCyan" })
|
|
98
|
-
export const brightWhite = (input: StylableInput): TextChunk => applyStyle(input, { fg: "brightWhite" })
|
|
99
|
-
|
|
100
|
-
// Background color functions
|
|
101
|
-
export const bgBlack = (input: StylableInput): TextChunk => applyStyle(input, { bg: "black" })
|
|
102
|
-
export const bgRed = (input: StylableInput): TextChunk => applyStyle(input, { bg: "red" })
|
|
103
|
-
export const bgGreen = (input: StylableInput): TextChunk => applyStyle(input, { bg: "green" })
|
|
104
|
-
export const bgYellow = (input: StylableInput): TextChunk => applyStyle(input, { bg: "yellow" })
|
|
105
|
-
export const bgBlue = (input: StylableInput): TextChunk => applyStyle(input, { bg: "blue" })
|
|
106
|
-
export const bgMagenta = (input: StylableInput): TextChunk => applyStyle(input, { bg: "magenta" })
|
|
107
|
-
export const bgCyan = (input: StylableInput): TextChunk => applyStyle(input, { bg: "cyan" })
|
|
108
|
-
export const bgWhite = (input: StylableInput): TextChunk => applyStyle(input, { bg: "white" })
|
|
109
|
-
|
|
110
|
-
// Style functions
|
|
111
|
-
export const bold = (input: StylableInput): TextChunk => applyStyle(input, { bold: true })
|
|
112
|
-
export const italic = (input: StylableInput): TextChunk => applyStyle(input, { italic: true })
|
|
113
|
-
export const underline = (input: StylableInput): TextChunk => applyStyle(input, { underline: true })
|
|
114
|
-
export const strikethrough = (input: StylableInput): TextChunk => applyStyle(input, { strikethrough: true })
|
|
115
|
-
export const dim = (input: StylableInput): TextChunk => applyStyle(input, { dim: true })
|
|
116
|
-
export const reverse = (input: StylableInput): TextChunk => applyStyle(input, { reverse: true })
|
|
117
|
-
export const blink = (input: StylableInput): TextChunk => applyStyle(input, { blink: true })
|
|
118
|
-
|
|
119
|
-
// Custom color functions
|
|
120
|
-
export const fg =
|
|
121
|
-
(color: Color) =>
|
|
122
|
-
(input: StylableInput): TextChunk =>
|
|
123
|
-
applyStyle(input, { fg: color })
|
|
124
|
-
export const bg =
|
|
125
|
-
(color: Color) =>
|
|
126
|
-
(input: StylableInput): TextChunk =>
|
|
127
|
-
applyStyle(input, { bg: color })
|
|
128
|
-
|
|
129
|
-
export const link =
|
|
130
|
-
(url: string) =>
|
|
131
|
-
(input: StylableInput): TextChunk => {
|
|
132
|
-
const chunk =
|
|
133
|
-
typeof input === "object" && "__isChunk" in input
|
|
134
|
-
? (input as TextChunk)
|
|
135
|
-
: {
|
|
136
|
-
__isChunk: true as const,
|
|
137
|
-
text: String(input),
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
...chunk,
|
|
142
|
-
link: { url },
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Template literal handler for styled text (non-cached version).
|
|
148
|
-
* Returns a StyledText object containing chunks of text with optional styles.
|
|
149
|
-
*/
|
|
150
|
-
export function t(strings: TemplateStringsArray, ...values: StylableInput[]): StyledText {
|
|
151
|
-
const chunks: TextChunk[] = []
|
|
152
|
-
|
|
153
|
-
for (let i = 0; i < strings.length; i++) {
|
|
154
|
-
const raw = strings[i]
|
|
155
|
-
|
|
156
|
-
if (raw) {
|
|
157
|
-
chunks.push({
|
|
158
|
-
__isChunk: true,
|
|
159
|
-
text: raw,
|
|
160
|
-
attributes: 0,
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const val = values[i]
|
|
165
|
-
if (typeof val === "object" && "__isChunk" in val) {
|
|
166
|
-
chunks.push(val as TextChunk)
|
|
167
|
-
} else if (val !== undefined) {
|
|
168
|
-
const plainTextStr = String(val)
|
|
169
|
-
chunks.push({
|
|
170
|
-
__isChunk: true,
|
|
171
|
-
text: plainTextStr,
|
|
172
|
-
attributes: 0,
|
|
173
|
-
})
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return new StyledText(chunks)
|
|
178
|
-
}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { test, expect, describe } from "bun:test"
|
|
2
|
-
import {
|
|
3
|
-
isCapabilityResponse,
|
|
4
|
-
isPixelResolutionResponse,
|
|
5
|
-
parsePixelResolution,
|
|
6
|
-
} from "./terminal-capability-detection.js"
|
|
7
|
-
|
|
8
|
-
describe("isCapabilityResponse", () => {
|
|
9
|
-
test("detects DECRPM responses", () => {
|
|
10
|
-
expect(isCapabilityResponse("\x1b[?1016;2$y")).toBe(true)
|
|
11
|
-
expect(isCapabilityResponse("\x1b[?2027;0$y")).toBe(true)
|
|
12
|
-
expect(isCapabilityResponse("\x1b[?2031;2$y")).toBe(true)
|
|
13
|
-
expect(isCapabilityResponse("\x1b[?1004;1$y")).toBe(true)
|
|
14
|
-
expect(isCapabilityResponse("\x1b[?2026;2$y")).toBe(true)
|
|
15
|
-
expect(isCapabilityResponse("\x1b[?2004;2$y")).toBe(true)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
test("detects CPR responses for width detection", () => {
|
|
19
|
-
expect(isCapabilityResponse("\x1b[1;2R")).toBe(true) // explicit width
|
|
20
|
-
expect(isCapabilityResponse("\x1b[1;3R")).toBe(true) // scaled text
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
test("does not detect regular CPR responses as capabilities", () => {
|
|
24
|
-
// Regular cursor position reports are NOT capabilities
|
|
25
|
-
expect(isCapabilityResponse("\x1b[10;5R")).toBe(false)
|
|
26
|
-
expect(isCapabilityResponse("\x1b[20;30R")).toBe(false)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test("detects XTVersion responses", () => {
|
|
30
|
-
expect(isCapabilityResponse("\x1bP>|kitty(0.40.1)\x1b\\")).toBe(true)
|
|
31
|
-
expect(isCapabilityResponse("\x1bP>|ghostty 1.1.3\x1b\\")).toBe(true)
|
|
32
|
-
expect(isCapabilityResponse("\x1bP>|tmux 3.5a\x1b\\")).toBe(true)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test("detects Kitty graphics responses", () => {
|
|
36
|
-
expect(isCapabilityResponse("\x1b_Gi=1;OK\x1b\\")).toBe(true)
|
|
37
|
-
expect(isCapabilityResponse("\x1b_Gi=1;EINVAL:Zero width/height not allowed\x1b\\")).toBe(true)
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
test("detects DA1 (Device Attributes) responses", () => {
|
|
41
|
-
expect(isCapabilityResponse("\x1b[?62;c")).toBe(true)
|
|
42
|
-
expect(isCapabilityResponse("\x1b[?62;22c")).toBe(true)
|
|
43
|
-
expect(isCapabilityResponse("\x1b[?1;2;4c")).toBe(true)
|
|
44
|
-
expect(isCapabilityResponse("\x1b[?6c")).toBe(true)
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
test("detects Kitty keyboard query responses", () => {
|
|
48
|
-
expect(isCapabilityResponse("\x1b[?0u")).toBe(true)
|
|
49
|
-
expect(isCapabilityResponse("\x1b[?1u")).toBe(true)
|
|
50
|
-
expect(isCapabilityResponse("\x1b[?31u")).toBe(true)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
test("does not detect regular keypresses", () => {
|
|
54
|
-
expect(isCapabilityResponse("a")).toBe(false)
|
|
55
|
-
expect(isCapabilityResponse("A")).toBe(false)
|
|
56
|
-
expect(isCapabilityResponse("\x1b")).toBe(false)
|
|
57
|
-
expect(isCapabilityResponse("\x1ba")).toBe(false)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
test("does not detect arrow keys", () => {
|
|
61
|
-
expect(isCapabilityResponse("\x1b[A")).toBe(false)
|
|
62
|
-
expect(isCapabilityResponse("\x1b[B")).toBe(false)
|
|
63
|
-
expect(isCapabilityResponse("\x1b[C")).toBe(false)
|
|
64
|
-
expect(isCapabilityResponse("\x1b[D")).toBe(false)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test("does not detect function keys", () => {
|
|
68
|
-
expect(isCapabilityResponse("\x1bOP")).toBe(false)
|
|
69
|
-
expect(isCapabilityResponse("\x1b[11~")).toBe(false)
|
|
70
|
-
expect(isCapabilityResponse("\x1b[24~")).toBe(false)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
test("does not detect modified arrow keys", () => {
|
|
74
|
-
expect(isCapabilityResponse("\x1b[1;2A")).toBe(false)
|
|
75
|
-
expect(isCapabilityResponse("\x1b[1;5C")).toBe(false)
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
test("does not detect mouse sequences", () => {
|
|
79
|
-
expect(isCapabilityResponse("\x1b[<35;20;5m")).toBe(false)
|
|
80
|
-
expect(isCapabilityResponse("\x1b[<0;10;10M")).toBe(false)
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
describe("isPixelResolutionResponse", () => {
|
|
85
|
-
test("detects pixel resolution responses", () => {
|
|
86
|
-
expect(isPixelResolutionResponse("\x1b[4;720;1280t")).toBe(true)
|
|
87
|
-
expect(isPixelResolutionResponse("\x1b[4;1080;1920t")).toBe(true)
|
|
88
|
-
expect(isPixelResolutionResponse("\x1b[4;0;0t")).toBe(true)
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
test("does not detect other sequences", () => {
|
|
92
|
-
expect(isPixelResolutionResponse("a")).toBe(false)
|
|
93
|
-
expect(isPixelResolutionResponse("\x1b[A")).toBe(false)
|
|
94
|
-
expect(isPixelResolutionResponse("\x1b[?1016;2$y")).toBe(false)
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
describe("parsePixelResolution", () => {
|
|
99
|
-
test("parses valid pixel resolution responses", () => {
|
|
100
|
-
expect(parsePixelResolution("\x1b[4;720;1280t")).toEqual({ width: 1280, height: 720 })
|
|
101
|
-
expect(parsePixelResolution("\x1b[4;1080;1920t")).toEqual({ width: 1920, height: 1080 })
|
|
102
|
-
expect(parsePixelResolution("\x1b[4;0;0t")).toEqual({ width: 0, height: 0 })
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
test("returns null for invalid sequences", () => {
|
|
106
|
-
expect(parsePixelResolution("a")).toBeNull()
|
|
107
|
-
expect(parsePixelResolution("\x1b[A")).toBeNull()
|
|
108
|
-
expect(parsePixelResolution("\x1b[?1016;2$y")).toBeNull()
|
|
109
|
-
})
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
describe("real-world terminal capability sequences", () => {
|
|
113
|
-
test("kitty terminal full response - individual sequences", () => {
|
|
114
|
-
// Should detect multiple capability sequences
|
|
115
|
-
expect(isCapabilityResponse("\x1b[?1016;2$y")).toBe(true)
|
|
116
|
-
expect(isCapabilityResponse("\x1b[?2027;0$y")).toBe(true)
|
|
117
|
-
expect(isCapabilityResponse("\x1b[1;2R")).toBe(true)
|
|
118
|
-
expect(isCapabilityResponse("\x1b[1;3R")).toBe(true)
|
|
119
|
-
expect(isCapabilityResponse("\x1bP>|kitty(0.40.1)\x1b\\")).toBe(true)
|
|
120
|
-
expect(isCapabilityResponse("\x1b_Gi=1;EINVAL:Zero width/height not allowed\x1b\\")).toBe(true)
|
|
121
|
-
expect(isCapabilityResponse("\x1b[?62;c")).toBe(true)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
test("ghostty terminal response - individual sequences", () => {
|
|
125
|
-
expect(isCapabilityResponse("\x1bP>|ghostty 1.1.3\x1b\\")).toBe(true)
|
|
126
|
-
expect(isCapabilityResponse("\x1b_Gi=1;OK\x1b\\")).toBe(true)
|
|
127
|
-
expect(isCapabilityResponse("\x1b[?62;22c")).toBe(true)
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
test("alacritty terminal response - individual sequences", () => {
|
|
131
|
-
expect(isCapabilityResponse("\x1b[?1016;0$y")).toBe(true)
|
|
132
|
-
expect(isCapabilityResponse("\x1b[?6c")).toBe(true)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
test("vscode terminal minimal response", () => {
|
|
136
|
-
expect(isCapabilityResponse("\x1b[?1016;2$y")).toBe(true)
|
|
137
|
-
})
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
describe("renderer capabilities event", () => {
|
|
141
|
-
/**
|
|
142
|
-
* The renderer emits "capabilities" event each time a capability response is processed.
|
|
143
|
-
* This happens multiple times at startup because the terminal responds to multiple queries:
|
|
144
|
-
* - DECRPM queries (sgr_pixels, unicode, color_scheme, focus, bracketed_paste, sync)
|
|
145
|
-
* - CPR queries for width detection (explicit_width, scaled_text)
|
|
146
|
-
* - XTVersion (terminal name/version, kitty detection)
|
|
147
|
-
* - Kitty keyboard query response
|
|
148
|
-
*
|
|
149
|
-
* Each response arrives async and triggers the event, so consumers should expect
|
|
150
|
-
* multiple emissions and handle them reactively.
|
|
151
|
-
*/
|
|
152
|
-
test("kitty terminal emits capabilities event for each response", async () => {
|
|
153
|
-
const { createTestRenderer } = await import("../testing/test-renderer")
|
|
154
|
-
const { renderer } = await createTestRenderer({})
|
|
155
|
-
|
|
156
|
-
const events: any[] = []
|
|
157
|
-
renderer.on("capabilities", (caps) => events.push({ ...caps }))
|
|
158
|
-
|
|
159
|
-
// Simulate all 10 Kitty capability responses (as they arrive separately)
|
|
160
|
-
const kittyResponses = [
|
|
161
|
-
"\x1b[?1016;2$y", // 1. sgr_pixels
|
|
162
|
-
"\x1b[?2027;0$y", // 2. unicode query
|
|
163
|
-
"\x1b[?2031;2$y", // 3. color_scheme_updates
|
|
164
|
-
"\x1b[?1004;2$y", // 4. focus_tracking
|
|
165
|
-
"\x1b[?2004;2$y", // 5. bracketed_paste
|
|
166
|
-
"\x1b[?2026;2$y", // 6. sync
|
|
167
|
-
"\x1b[1;2R", // 7. explicit_width (CPR)
|
|
168
|
-
"\x1b[1;3R", // 8. scaled_text (CPR)
|
|
169
|
-
"\x1bP>|kitty(0.42.2)\x1b\\", // 9. xtversion (triggers kitty detection)
|
|
170
|
-
"\x1b[?0u", // 10. kitty keyboard query
|
|
171
|
-
]
|
|
172
|
-
|
|
173
|
-
for (const response of kittyResponses) {
|
|
174
|
-
renderer.stdin.emit("data", Buffer.from(response))
|
|
175
|
-
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Should have received 10 capability events
|
|
179
|
-
expect(events.length).toBe(10)
|
|
180
|
-
|
|
181
|
-
// First event: sgr_pixels detected
|
|
182
|
-
expect(events[0].sgr_pixels).toBe(true)
|
|
183
|
-
|
|
184
|
-
// After xtversion (event 9): kitty_keyboard should be true
|
|
185
|
-
expect(events[8].kitty_keyboard).toBe(true)
|
|
186
|
-
expect(events[8].kitty_graphics).toBe(true)
|
|
187
|
-
expect(events[8].terminal.name).toBe("kitty")
|
|
188
|
-
expect(events[8].terminal.version).toBe("0.42.2")
|
|
189
|
-
|
|
190
|
-
// Final state should have all kitty capabilities
|
|
191
|
-
const finalCaps = events[9]
|
|
192
|
-
expect(finalCaps.kitty_keyboard).toBe(true)
|
|
193
|
-
expect(finalCaps.sgr_pixels).toBe(true)
|
|
194
|
-
expect(finalCaps.color_scheme_updates).toBe(true)
|
|
195
|
-
expect(finalCaps.focus_tracking).toBe(true)
|
|
196
|
-
expect(finalCaps.sync).toBe(true)
|
|
197
|
-
expect(finalCaps.explicit_width).toBe(true)
|
|
198
|
-
expect(finalCaps.scaled_text).toBe(true)
|
|
199
|
-
|
|
200
|
-
renderer.destroy()
|
|
201
|
-
})
|
|
202
|
-
})
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Terminal capability response detection utilities.
|
|
3
|
-
*
|
|
4
|
-
* Detects various terminal capability response sequences:
|
|
5
|
-
* - DECRPM (DEC Request Mode): ESC[?...;N$y where N is 0,1,2,3,4
|
|
6
|
-
* - CPR (Cursor Position Report): ESC[row;colR (used for width detection)
|
|
7
|
-
* - XTVersion: ESC P >| ... ESC \
|
|
8
|
-
* - Kitty Graphics: ESC _ G ... ESC \
|
|
9
|
-
* - Kitty Keyboard Query: ESC[?Nu where N is 0,1,2,etc
|
|
10
|
-
* - DA1 (Device Attributes): ESC[?...c
|
|
11
|
-
* - Pixel Resolution: ESC[4;height;widtht
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Check if a sequence is a terminal capability response.
|
|
16
|
-
* Returns true if the sequence matches any known capability response pattern.
|
|
17
|
-
*/
|
|
18
|
-
export function isCapabilityResponse(sequence: string): boolean {
|
|
19
|
-
// DECRPM: ESC[?digits;digits$y
|
|
20
|
-
if (/\x1b\[\?\d+(?:;\d+)*\$y/.test(sequence)) {
|
|
21
|
-
return true
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// CPR for explicit width/scaled text detection: ESC[1;NR where N >= 2
|
|
25
|
-
// The column number tells us how many characters were rendered with width annotations
|
|
26
|
-
// ESC[1;1R means no width support (cursor didn't move)
|
|
27
|
-
// ESC[1;2R or higher means width support (cursor moved after rendering)
|
|
28
|
-
// We accept any column >= 2 to handle cases where cursor wasn't at exact home position
|
|
29
|
-
if (/\x1b\[1;(?!1R)\d+R/.test(sequence)) {
|
|
30
|
-
return true
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// XTVersion: ESC P >| ... ESC \
|
|
34
|
-
if (/\x1bP>\|[\s\S]*?\x1b\\/.test(sequence)) {
|
|
35
|
-
return true
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Kitty graphics response: ESC _ G ... ESC \
|
|
39
|
-
// Matches any graphics response including OK, errors, etc.
|
|
40
|
-
// This is for filtering capability responses from user input
|
|
41
|
-
if (/\x1b_G[\s\S]*?\x1b\\/.test(sequence)) {
|
|
42
|
-
return true
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Kitty keyboard query response: ESC[?Nu or ESC[?N;Mu (progressive enhancement)
|
|
46
|
-
if (/\x1b\[\?\d+(?:;\d+)?u/.test(sequence)) {
|
|
47
|
-
return true
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// DA1 (Device Attributes): ESC[?...c
|
|
51
|
-
if (/\x1b\[\?[0-9;]*c/.test(sequence)) {
|
|
52
|
-
return true
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return false
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Check if a sequence is a pixel resolution response.
|
|
60
|
-
* Format: ESC[4;height;widtht
|
|
61
|
-
*/
|
|
62
|
-
export function isPixelResolutionResponse(sequence: string): boolean {
|
|
63
|
-
return /\x1b\[4;\d+;\d+t/.test(sequence)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Parse pixel resolution from response sequence.
|
|
68
|
-
* Returns { width, height } or null if not a valid resolution response.
|
|
69
|
-
*/
|
|
70
|
-
export function parsePixelResolution(sequence: string): { width: number; height: number } | null {
|
|
71
|
-
const match = sequence.match(/\x1b\[4;(\d+);(\d+)t/)
|
|
72
|
-
if (match) {
|
|
73
|
-
return {
|
|
74
|
-
width: parseInt(match[2]),
|
|
75
|
-
height: parseInt(match[1]),
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return null
|
|
79
|
-
}
|