@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.
Files changed (570) hide show
  1. package/3d/SpriteResourceManager.d.ts +74 -0
  2. package/3d/SpriteUtils.d.ts +13 -0
  3. package/3d/TextureUtils.d.ts +24 -0
  4. package/3d/ThreeRenderable.d.ts +40 -0
  5. package/3d/WGPURenderer.d.ts +61 -0
  6. package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
  7. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
  8. package/3d/animation/SpriteAnimator.d.ts +124 -0
  9. package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
  10. package/3d/canvas.d.ts +44 -0
  11. package/3d/index.d.ts +12 -0
  12. package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
  13. package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
  14. package/3d/physics/physics-interface.d.ts +27 -0
  15. package/3d.d.ts +2 -0
  16. package/3d.js +34042 -0
  17. package/3d.js.map +155 -0
  18. package/LICENSE +21 -0
  19. package/NativeSpanFeed.d.ts +41 -0
  20. package/Renderable.d.ts +334 -0
  21. package/animation/Timeline.d.ts +126 -0
  22. package/ansi.d.ts +13 -0
  23. package/buffer.d.ts +107 -0
  24. package/console.d.ts +143 -0
  25. package/edit-buffer.d.ts +98 -0
  26. package/editor-view.d.ts +73 -0
  27. package/index-e6ec7apq.js +18415 -0
  28. package/index-e6ec7apq.js.map +64 -0
  29. package/index-h066zmrb.js +12619 -0
  30. package/index-h066zmrb.js.map +43 -0
  31. package/index-ynzawt3n.js +113 -0
  32. package/index-ynzawt3n.js.map +10 -0
  33. package/index.d.ts +21 -0
  34. package/index.js +430 -0
  35. package/index.js.map +9 -0
  36. package/lib/KeyHandler.d.ts +61 -0
  37. package/lib/RGBA.d.ts +25 -0
  38. package/lib/ascii.font.d.ts +508 -0
  39. package/lib/border.d.ts +49 -0
  40. package/lib/bunfs.d.ts +7 -0
  41. package/lib/clipboard.d.ts +17 -0
  42. package/lib/clock.d.ts +15 -0
  43. package/lib/data-paths.d.ts +26 -0
  44. package/lib/debounce.d.ts +42 -0
  45. package/lib/detect-links.d.ts +6 -0
  46. package/lib/env.d.ts +42 -0
  47. package/lib/extmarks-history.d.ts +17 -0
  48. package/lib/extmarks.d.ts +89 -0
  49. package/lib/hast-styled-text.d.ts +17 -0
  50. package/lib/index.d.ts +21 -0
  51. package/lib/keymapping.d.ts +25 -0
  52. package/lib/objects-in-viewport.d.ts +24 -0
  53. package/lib/output.capture.d.ts +24 -0
  54. package/lib/parse.keypress-kitty.d.ts +2 -0
  55. package/lib/parse.keypress.d.ts +26 -0
  56. package/lib/parse.mouse.d.ts +30 -0
  57. package/lib/paste.d.ts +7 -0
  58. package/lib/queue.d.ts +15 -0
  59. package/lib/renderable.validations.d.ts +12 -0
  60. package/lib/scroll-acceleration.d.ts +43 -0
  61. package/lib/selection.d.ts +63 -0
  62. package/lib/singleton.d.ts +7 -0
  63. package/lib/stdin-parser.d.ts +76 -0
  64. package/lib/styled-text.d.ts +63 -0
  65. package/lib/terminal-capability-detection.d.ts +30 -0
  66. package/lib/terminal-palette.d.ts +50 -0
  67. package/lib/tree-sitter/assets/update.d.ts +11 -0
  68. package/lib/tree-sitter/client.d.ts +47 -0
  69. package/lib/tree-sitter/default-parsers.d.ts +2 -0
  70. package/lib/tree-sitter/download-utils.d.ts +21 -0
  71. package/lib/tree-sitter/index.d.ts +8 -0
  72. package/lib/tree-sitter/parser.worker.d.ts +1 -0
  73. package/lib/tree-sitter/parsers-config.d.ts +38 -0
  74. package/lib/tree-sitter/resolve-ft.d.ts +2 -0
  75. package/lib/tree-sitter/types.d.ts +81 -0
  76. package/lib/tree-sitter-styled-text.d.ts +14 -0
  77. package/lib/validate-dir-name.d.ts +1 -0
  78. package/lib/yoga.options.d.ts +32 -0
  79. package/package.json +51 -63
  80. package/parser.worker.js +869 -0
  81. package/parser.worker.js.map +12 -0
  82. package/plugins/core-slot.d.ts +72 -0
  83. package/plugins/registry.d.ts +38 -0
  84. package/plugins/types.d.ts +34 -0
  85. package/post/filters.d.ts +105 -0
  86. package/renderables/ASCIIFont.d.ts +52 -0
  87. package/renderables/Box.d.ts +72 -0
  88. package/renderables/Code.d.ts +78 -0
  89. package/renderables/Diff.d.ts +142 -0
  90. package/renderables/EditBufferRenderable.d.ts +162 -0
  91. package/renderables/FrameBuffer.d.ts +16 -0
  92. package/renderables/Input.d.ts +67 -0
  93. package/renderables/LineNumberRenderable.d.ts +74 -0
  94. package/renderables/Markdown.d.ts +173 -0
  95. package/renderables/ScrollBar.d.ts +77 -0
  96. package/renderables/ScrollBox.d.ts +124 -0
  97. package/renderables/Select.d.ts +115 -0
  98. package/renderables/Slider.d.ts +44 -0
  99. package/renderables/TabSelect.d.ts +96 -0
  100. package/renderables/Text.d.ts +36 -0
  101. package/renderables/TextBufferRenderable.d.ts +105 -0
  102. package/renderables/TextNode.d.ts +91 -0
  103. package/renderables/TextTable.d.ts +140 -0
  104. package/renderables/Textarea.d.ts +114 -0
  105. package/renderables/TimeToFirstDraw.d.ts +24 -0
  106. package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
  107. package/renderables/composition/VRenderable.d.ts +16 -0
  108. package/renderables/composition/constructs.d.ts +35 -0
  109. package/renderables/composition/vnode.d.ts +46 -0
  110. package/renderables/index.d.ts +22 -0
  111. package/renderables/markdown-parser.d.ts +10 -0
  112. package/renderer.d.ts +388 -0
  113. package/runtime-plugin-support.d.ts +3 -0
  114. package/runtime-plugin-support.js +29 -0
  115. package/runtime-plugin-support.js.map +10 -0
  116. package/runtime-plugin.d.ts +11 -0
  117. package/runtime-plugin.js +16 -0
  118. package/runtime-plugin.js.map +9 -0
  119. package/syntax-style.d.ts +54 -0
  120. package/testing/manual-clock.d.ts +16 -0
  121. package/testing/mock-keys.d.ts +81 -0
  122. package/testing/mock-mouse.d.ts +38 -0
  123. package/testing/mock-tree-sitter-client.d.ts +23 -0
  124. package/testing/spy.d.ts +7 -0
  125. package/testing/test-recorder.d.ts +61 -0
  126. package/testing/test-renderer.d.ts +23 -0
  127. package/testing.d.ts +6 -0
  128. package/testing.js +675 -0
  129. package/testing.js.map +15 -0
  130. package/text-buffer-view.d.ts +42 -0
  131. package/text-buffer.d.ts +67 -0
  132. package/types.d.ts +131 -0
  133. package/utils.d.ts +14 -0
  134. package/zig-structs.d.ts +155 -0
  135. package/zig.d.ts +351 -0
  136. package/dev/keypress-debug-renderer.ts +0 -148
  137. package/dev/keypress-debug.ts +0 -43
  138. package/dev/print-env-vars.ts +0 -32
  139. package/dev/test-tmux-graphics-334.sh +0 -68
  140. package/dev/thai-debug-test.ts +0 -68
  141. package/docs/development.md +0 -141
  142. package/docs/env-vars.md +0 -140
  143. package/docs/getting-started.md +0 -353
  144. package/docs/renderables-vs-constructs.md +0 -159
  145. package/docs/tree-sitter.md +0 -311
  146. package/scripts/build.ts +0 -400
  147. package/scripts/publish.ts +0 -60
  148. package/src/3d/SpriteResourceManager.ts +0 -286
  149. package/src/3d/SpriteUtils.ts +0 -71
  150. package/src/3d/TextureUtils.ts +0 -196
  151. package/src/3d/ThreeRenderable.ts +0 -197
  152. package/src/3d/WGPURenderer.ts +0 -294
  153. package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
  154. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
  155. package/src/3d/animation/SpriteAnimator.ts +0 -633
  156. package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
  157. package/src/3d/canvas.ts +0 -464
  158. package/src/3d/index.ts +0 -12
  159. package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
  160. package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
  161. package/src/3d/physics/physics-interface.ts +0 -31
  162. package/src/3d/shaders/supersampling.wgsl +0 -201
  163. package/src/3d.ts +0 -3
  164. package/src/NativeSpanFeed.ts +0 -300
  165. package/src/Renderable.ts +0 -1698
  166. package/src/__snapshots__/buffer.test.ts.snap +0 -28
  167. package/src/animation/Timeline.test.ts +0 -2709
  168. package/src/animation/Timeline.ts +0 -598
  169. package/src/ansi.ts +0 -18
  170. package/src/benchmark/latest-all-bench-run.json +0 -707
  171. package/src/benchmark/latest-async-bench-run.json +0 -336
  172. package/src/benchmark/latest-default-bench-run.json +0 -657
  173. package/src/benchmark/latest-large-bench-run.json +0 -707
  174. package/src/benchmark/latest-quick-bench-run.json +0 -207
  175. package/src/benchmark/markdown-benchmark.ts +0 -1804
  176. package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
  177. package/src/benchmark/native-span-feed-benchmark.md +0 -56
  178. package/src/benchmark/native-span-feed-benchmark.ts +0 -596
  179. package/src/benchmark/native-span-feed-compare.ts +0 -280
  180. package/src/benchmark/renderer-benchmark.ts +0 -754
  181. package/src/benchmark/text-table-benchmark.ts +0 -947
  182. package/src/buffer.test.ts +0 -291
  183. package/src/buffer.ts +0 -519
  184. package/src/console.test.ts +0 -612
  185. package/src/console.ts +0 -1255
  186. package/src/edit-buffer.test.ts +0 -1769
  187. package/src/edit-buffer.ts +0 -411
  188. package/src/editor-view.test.ts +0 -1032
  189. package/src/editor-view.ts +0 -284
  190. package/src/examples/ascii-font-selection-demo.ts +0 -245
  191. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  192. package/src/examples/assets/concrete.png +0 -0
  193. package/src/examples/assets/crate.png +0 -0
  194. package/src/examples/assets/crate_emissive.png +0 -0
  195. package/src/examples/assets/forrest_background.png +0 -0
  196. package/src/examples/assets/hast-example.json +0 -1018
  197. package/src/examples/assets/heart.png +0 -0
  198. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  199. package/src/examples/assets/main_char_idle.png +0 -0
  200. package/src/examples/assets/main_char_jump_end.png +0 -0
  201. package/src/examples/assets/main_char_jump_landing.png +0 -0
  202. package/src/examples/assets/main_char_jump_start.png +0 -0
  203. package/src/examples/assets/main_char_run_loop.png +0 -0
  204. package/src/examples/assets/roughness_map.jpg +0 -0
  205. package/src/examples/build.ts +0 -115
  206. package/src/examples/code-demo.ts +0 -584
  207. package/src/examples/console-demo.ts +0 -358
  208. package/src/examples/core-plugin-slots-demo.ts +0 -759
  209. package/src/examples/diff-demo.ts +0 -699
  210. package/src/examples/draggable-three-demo.ts +0 -259
  211. package/src/examples/editor-demo.ts +0 -322
  212. package/src/examples/extmarks-demo.ts +0 -204
  213. package/src/examples/focus-restore-demo.ts +0 -310
  214. package/src/examples/fonts.ts +0 -245
  215. package/src/examples/fractal-shader-demo.ts +0 -268
  216. package/src/examples/framebuffer-demo.ts +0 -674
  217. package/src/examples/full-unicode-demo.ts +0 -181
  218. package/src/examples/golden-star-demo.ts +0 -933
  219. package/src/examples/grayscale-buffer-demo.ts +0 -249
  220. package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
  221. package/src/examples/index.ts +0 -925
  222. package/src/examples/input-demo.ts +0 -377
  223. package/src/examples/input-select-layout-demo.ts +0 -425
  224. package/src/examples/install.sh +0 -143
  225. package/src/examples/keypress-debug-demo.ts +0 -452
  226. package/src/examples/lib/HexList.ts +0 -122
  227. package/src/examples/lib/PaletteGrid.ts +0 -125
  228. package/src/examples/lib/standalone-keys.ts +0 -25
  229. package/src/examples/lib/tab-controller.ts +0 -243
  230. package/src/examples/lights-phong-demo.ts +0 -290
  231. package/src/examples/link-demo.ts +0 -220
  232. package/src/examples/live-state-demo.ts +0 -480
  233. package/src/examples/markdown-demo.ts +0 -620
  234. package/src/examples/mouse-interaction-demo.ts +0 -428
  235. package/src/examples/nested-zindex-demo.ts +0 -357
  236. package/src/examples/opacity-example.ts +0 -235
  237. package/src/examples/opentui-demo.ts +0 -1057
  238. package/src/examples/physx-planck-2d-demo.ts +0 -507
  239. package/src/examples/physx-rapier-2d-demo.ts +0 -526
  240. package/src/examples/relative-positioning-demo.ts +0 -323
  241. package/src/examples/scroll-example.ts +0 -214
  242. package/src/examples/scrollbox-mouse-test.ts +0 -112
  243. package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
  244. package/src/examples/select-demo.ts +0 -237
  245. package/src/examples/shader-cube-demo.ts +0 -772
  246. package/src/examples/simple-layout-example.ts +0 -591
  247. package/src/examples/slider-demo.ts +0 -617
  248. package/src/examples/split-mode-demo.ts +0 -445
  249. package/src/examples/sprite-animation-demo.ts +0 -443
  250. package/src/examples/sprite-particle-generator-demo.ts +0 -486
  251. package/src/examples/static-sprite-demo.ts +0 -193
  252. package/src/examples/sticky-scroll-example.ts +0 -308
  253. package/src/examples/styled-text-demo.ts +0 -282
  254. package/src/examples/tab-select-demo.ts +0 -219
  255. package/src/examples/terminal-title.ts +0 -29
  256. package/src/examples/terminal.ts +0 -305
  257. package/src/examples/text-node-demo.ts +0 -416
  258. package/src/examples/text-selection-demo.ts +0 -377
  259. package/src/examples/text-table-demo.ts +0 -503
  260. package/src/examples/text-truncation-demo.ts +0 -481
  261. package/src/examples/text-wrap.ts +0 -757
  262. package/src/examples/texture-loading-demo.ts +0 -259
  263. package/src/examples/timeline-example.ts +0 -670
  264. package/src/examples/transparency-demo.ts +0 -241
  265. package/src/examples/vnode-composition-demo.ts +0 -404
  266. package/src/index.ts +0 -22
  267. package/src/lib/KeyHandler.integration.test.ts +0 -292
  268. package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
  269. package/src/lib/KeyHandler.test.ts +0 -662
  270. package/src/lib/KeyHandler.ts +0 -222
  271. package/src/lib/RGBA.test.ts +0 -984
  272. package/src/lib/RGBA.ts +0 -204
  273. package/src/lib/ascii.font.ts +0 -330
  274. package/src/lib/border.test.ts +0 -83
  275. package/src/lib/border.ts +0 -168
  276. package/src/lib/bunfs.test.ts +0 -27
  277. package/src/lib/bunfs.ts +0 -18
  278. package/src/lib/clipboard.test.ts +0 -41
  279. package/src/lib/clipboard.ts +0 -47
  280. package/src/lib/clock.ts +0 -31
  281. package/src/lib/data-paths.test.ts +0 -133
  282. package/src/lib/data-paths.ts +0 -109
  283. package/src/lib/debounce.ts +0 -106
  284. package/src/lib/detect-links.test.ts +0 -98
  285. package/src/lib/detect-links.ts +0 -56
  286. package/src/lib/env.test.ts +0 -228
  287. package/src/lib/env.ts +0 -209
  288. package/src/lib/extmarks-history.ts +0 -51
  289. package/src/lib/extmarks-multiwidth.test.ts +0 -322
  290. package/src/lib/extmarks.test.ts +0 -3457
  291. package/src/lib/extmarks.ts +0 -843
  292. package/src/lib/fonts/block.json +0 -405
  293. package/src/lib/fonts/grid.json +0 -265
  294. package/src/lib/fonts/huge.json +0 -741
  295. package/src/lib/fonts/pallet.json +0 -314
  296. package/src/lib/fonts/shade.json +0 -591
  297. package/src/lib/fonts/slick.json +0 -321
  298. package/src/lib/fonts/tiny.json +0 -69
  299. package/src/lib/hast-styled-text.ts +0 -59
  300. package/src/lib/index.ts +0 -21
  301. package/src/lib/keymapping.test.ts +0 -280
  302. package/src/lib/keymapping.ts +0 -87
  303. package/src/lib/objects-in-viewport.test.ts +0 -787
  304. package/src/lib/objects-in-viewport.ts +0 -153
  305. package/src/lib/output.capture.ts +0 -58
  306. package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
  307. package/src/lib/parse.keypress-kitty.test.ts +0 -663
  308. package/src/lib/parse.keypress-kitty.ts +0 -439
  309. package/src/lib/parse.keypress.test.ts +0 -1849
  310. package/src/lib/parse.keypress.ts +0 -397
  311. package/src/lib/parse.mouse.test.ts +0 -552
  312. package/src/lib/parse.mouse.ts +0 -232
  313. package/src/lib/paste.ts +0 -16
  314. package/src/lib/queue.ts +0 -65
  315. package/src/lib/renderable.validations.test.ts +0 -87
  316. package/src/lib/renderable.validations.ts +0 -83
  317. package/src/lib/scroll-acceleration.ts +0 -98
  318. package/src/lib/selection.ts +0 -240
  319. package/src/lib/singleton.ts +0 -28
  320. package/src/lib/stdin-parser.test.ts +0 -1676
  321. package/src/lib/stdin-parser.ts +0 -1248
  322. package/src/lib/styled-text.ts +0 -178
  323. package/src/lib/terminal-capability-detection.test.ts +0 -202
  324. package/src/lib/terminal-capability-detection.ts +0 -79
  325. package/src/lib/terminal-palette.test.ts +0 -878
  326. package/src/lib/terminal-palette.ts +0 -383
  327. package/src/lib/tree-sitter/assets/README.md +0 -118
  328. package/src/lib/tree-sitter/assets/update.ts +0 -331
  329. package/src/lib/tree-sitter/assets.d.ts +0 -9
  330. package/src/lib/tree-sitter/cache.test.ts +0 -270
  331. package/src/lib/tree-sitter/client.test.ts +0 -1061
  332. package/src/lib/tree-sitter/client.ts +0 -615
  333. package/src/lib/tree-sitter/default-parsers.ts +0 -80
  334. package/src/lib/tree-sitter/download-utils.ts +0 -148
  335. package/src/lib/tree-sitter/index.ts +0 -28
  336. package/src/lib/tree-sitter/parser.worker.ts +0 -1001
  337. package/src/lib/tree-sitter/parsers-config.ts +0 -75
  338. package/src/lib/tree-sitter/resolve-ft.ts +0 -62
  339. package/src/lib/tree-sitter/types.ts +0 -81
  340. package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
  341. package/src/lib/tree-sitter-styled-text.ts +0 -306
  342. package/src/lib/validate-dir-name.ts +0 -55
  343. package/src/lib/yoga.options.test.ts +0 -628
  344. package/src/lib/yoga.options.ts +0 -346
  345. package/src/plugins/core-slot.ts +0 -579
  346. package/src/plugins/registry.ts +0 -377
  347. package/src/plugins/types.ts +0 -46
  348. package/src/post/filters.ts +0 -888
  349. package/src/renderables/ASCIIFont.ts +0 -219
  350. package/src/renderables/Box.test.ts +0 -160
  351. package/src/renderables/Box.ts +0 -295
  352. package/src/renderables/Code.test.ts +0 -2062
  353. package/src/renderables/Code.ts +0 -357
  354. package/src/renderables/Diff.regression.test.ts +0 -226
  355. package/src/renderables/Diff.test.ts +0 -3027
  356. package/src/renderables/Diff.ts +0 -1209
  357. package/src/renderables/EditBufferRenderable.ts +0 -764
  358. package/src/renderables/FrameBuffer.ts +0 -47
  359. package/src/renderables/Input.test.ts +0 -1228
  360. package/src/renderables/Input.ts +0 -245
  361. package/src/renderables/LineNumberRenderable.ts +0 -675
  362. package/src/renderables/Markdown.ts +0 -1106
  363. package/src/renderables/ScrollBar.ts +0 -422
  364. package/src/renderables/ScrollBox.ts +0 -883
  365. package/src/renderables/Select.test.ts +0 -1010
  366. package/src/renderables/Select.ts +0 -523
  367. package/src/renderables/Slider.test.ts +0 -456
  368. package/src/renderables/Slider.ts +0 -347
  369. package/src/renderables/TabSelect.test.ts +0 -197
  370. package/src/renderables/TabSelect.ts +0 -455
  371. package/src/renderables/Text.selection-buffer.test.ts +0 -123
  372. package/src/renderables/Text.test.ts +0 -2660
  373. package/src/renderables/Text.ts +0 -147
  374. package/src/renderables/TextBufferRenderable.ts +0 -518
  375. package/src/renderables/TextNode.test.ts +0 -1058
  376. package/src/renderables/TextNode.ts +0 -325
  377. package/src/renderables/TextTable.test.ts +0 -1421
  378. package/src/renderables/TextTable.ts +0 -1344
  379. package/src/renderables/Textarea.ts +0 -732
  380. package/src/renderables/TimeToFirstDraw.ts +0 -89
  381. package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
  382. package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
  383. package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
  384. package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
  385. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
  386. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
  387. package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1787
  388. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
  389. package/src/renderables/__tests__/Markdown.test.ts +0 -2287
  390. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
  391. package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
  392. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
  393. package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
  394. package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
  395. package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
  396. package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
  397. package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
  398. package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
  399. package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1864
  400. package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
  401. package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
  402. package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
  403. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
  404. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
  405. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
  406. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
  407. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
  408. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
  409. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
  410. package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
  411. package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
  412. package/src/renderables/composition/README.md +0 -8
  413. package/src/renderables/composition/VRenderable.ts +0 -32
  414. package/src/renderables/composition/constructs.ts +0 -127
  415. package/src/renderables/composition/vnode.ts +0 -289
  416. package/src/renderables/index.ts +0 -22
  417. package/src/renderables/markdown-parser.ts +0 -66
  418. package/src/renderer.ts +0 -2363
  419. package/src/runtime-plugin-support.ts +0 -39
  420. package/src/runtime-plugin.ts +0 -144
  421. package/src/syntax-style.test.ts +0 -841
  422. package/src/syntax-style.ts +0 -264
  423. package/src/testing/README.md +0 -210
  424. package/src/testing/capture-spans.test.ts +0 -194
  425. package/src/testing/integration.test.ts +0 -276
  426. package/src/testing/manual-clock.ts +0 -106
  427. package/src/testing/mock-keys.test.ts +0 -1356
  428. package/src/testing/mock-keys.ts +0 -449
  429. package/src/testing/mock-mouse.test.ts +0 -218
  430. package/src/testing/mock-mouse.ts +0 -247
  431. package/src/testing/mock-tree-sitter-client.ts +0 -73
  432. package/src/testing/spy.ts +0 -13
  433. package/src/testing/test-recorder.test.ts +0 -415
  434. package/src/testing/test-recorder.ts +0 -145
  435. package/src/testing/test-renderer.ts +0 -116
  436. package/src/testing.ts +0 -7
  437. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
  438. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
  439. package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
  440. package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
  441. package/src/tests/allocator-stats.test.ts +0 -38
  442. package/src/tests/destroy-during-render.test.ts +0 -200
  443. package/src/tests/hover-cursor.test.ts +0 -98
  444. package/src/tests/native-span-feed-async.test.ts +0 -173
  445. package/src/tests/native-span-feed-close.test.ts +0 -120
  446. package/src/tests/native-span-feed-coverage.test.ts +0 -227
  447. package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
  448. package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
  449. package/src/tests/opacity.test.ts +0 -123
  450. package/src/tests/renderable.snapshot.test.ts +0 -524
  451. package/src/tests/renderable.test.ts +0 -1281
  452. package/src/tests/renderer.console-startup.test.ts +0 -65
  453. package/src/tests/renderer.control.test.ts +0 -364
  454. package/src/tests/renderer.core-slot-binding.test.ts +0 -952
  455. package/src/tests/renderer.cursor.test.ts +0 -26
  456. package/src/tests/renderer.destroy-during-render.test.ts +0 -110
  457. package/src/tests/renderer.focus-restore.test.ts +0 -228
  458. package/src/tests/renderer.focus.test.ts +0 -251
  459. package/src/tests/renderer.idle.test.ts +0 -219
  460. package/src/tests/renderer.input.test.ts +0 -2145
  461. package/src/tests/renderer.kitty-flags.test.ts +0 -195
  462. package/src/tests/renderer.mouse.test.ts +0 -1269
  463. package/src/tests/renderer.palette.test.ts +0 -629
  464. package/src/tests/renderer.selection.test.ts +0 -49
  465. package/src/tests/renderer.slot-registry.test.ts +0 -649
  466. package/src/tests/renderer.useMouse.test.ts +0 -50
  467. package/src/tests/runtime-plugin-support.fixture.ts +0 -11
  468. package/src/tests/runtime-plugin-support.test.ts +0 -28
  469. package/src/tests/runtime-plugin.fixture.ts +0 -40
  470. package/src/tests/runtime-plugin.test.ts +0 -190
  471. package/src/tests/scrollbox-culling-bug.test.ts +0 -114
  472. package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
  473. package/src/tests/scrollbox-hitgrid.test.ts +0 -909
  474. package/src/tests/scrollbox.test.ts +0 -1530
  475. package/src/tests/wrap-resize-perf.test.ts +0 -229
  476. package/src/tests/yoga-setters.test.ts +0 -921
  477. package/src/text-buffer-view.test.ts +0 -705
  478. package/src/text-buffer-view.ts +0 -189
  479. package/src/text-buffer.test.ts +0 -347
  480. package/src/text-buffer.ts +0 -250
  481. package/src/types.ts +0 -152
  482. package/src/utils.ts +0 -88
  483. package/src/zig/ansi.zig +0 -268
  484. package/src/zig/bench/README.md +0 -50
  485. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
  486. package/src/zig/bench/edit-buffer_bench.zig +0 -476
  487. package/src/zig/bench/native-span-feed_bench.zig +0 -100
  488. package/src/zig/bench/rope-markers_bench.zig +0 -713
  489. package/src/zig/bench/rope_bench.zig +0 -514
  490. package/src/zig/bench/styled-text_bench.zig +0 -470
  491. package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
  492. package/src/zig/bench/text-buffer-view_bench.zig +0 -459
  493. package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
  494. package/src/zig/bench/utf8_bench.zig +0 -799
  495. package/src/zig/bench-utils.zig +0 -431
  496. package/src/zig/bench.zig +0 -217
  497. package/src/zig/buffer.zig +0 -2223
  498. package/src/zig/build.zig +0 -289
  499. package/src/zig/build.zig.zon +0 -16
  500. package/src/zig/edit-buffer.zig +0 -825
  501. package/src/zig/editor-view.zig +0 -802
  502. package/src/zig/event-bus.zig +0 -13
  503. package/src/zig/event-emitter.zig +0 -65
  504. package/src/zig/file-logger.zig +0 -92
  505. package/src/zig/grapheme.zig +0 -599
  506. package/src/zig/lib.zig +0 -1834
  507. package/src/zig/link.zig +0 -333
  508. package/src/zig/logger.zig +0 -43
  509. package/src/zig/mem-registry.zig +0 -125
  510. package/src/zig/native-span-feed-bench-lib.zig +0 -7
  511. package/src/zig/native-span-feed.zig +0 -708
  512. package/src/zig/renderer.zig +0 -1386
  513. package/src/zig/rope.zig +0 -1220
  514. package/src/zig/syntax-style.zig +0 -161
  515. package/src/zig/terminal.zig +0 -975
  516. package/src/zig/test.zig +0 -70
  517. package/src/zig/tests/README.md +0 -18
  518. package/src/zig/tests/buffer_test.zig +0 -2526
  519. package/src/zig/tests/edit-buffer-history_test.zig +0 -271
  520. package/src/zig/tests/edit-buffer_test.zig +0 -1689
  521. package/src/zig/tests/editor-view_test.zig +0 -3299
  522. package/src/zig/tests/event-emitter_test.zig +0 -249
  523. package/src/zig/tests/grapheme_test.zig +0 -1304
  524. package/src/zig/tests/link_test.zig +0 -190
  525. package/src/zig/tests/mem-registry_test.zig +0 -473
  526. package/src/zig/tests/memory_leak_regression_test.zig +0 -159
  527. package/src/zig/tests/native-span-feed_test.zig +0 -1264
  528. package/src/zig/tests/renderer_test.zig +0 -1010
  529. package/src/zig/tests/rope-nested_test.zig +0 -712
  530. package/src/zig/tests/rope_fuzz_test.zig +0 -238
  531. package/src/zig/tests/rope_test.zig +0 -2362
  532. package/src/zig/tests/segment-merge.test.zig +0 -148
  533. package/src/zig/tests/syntax-style_test.zig +0 -557
  534. package/src/zig/tests/terminal_test.zig +0 -719
  535. package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
  536. package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
  537. package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
  538. package/src/zig/tests/text-buffer-segment_test.zig +0 -320
  539. package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
  540. package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
  541. package/src/zig/tests/text-buffer-view_test.zig +0 -3649
  542. package/src/zig/tests/text-buffer_test.zig +0 -2191
  543. package/src/zig/tests/unicode-width-map.zon +0 -3909
  544. package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
  545. package/src/zig/tests/utf8_test.zig +0 -4057
  546. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
  547. package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
  548. package/src/zig/tests/word-wrap-editing_test.zig +0 -498
  549. package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
  550. package/src/zig/text-buffer-iterators.zig +0 -499
  551. package/src/zig/text-buffer-segment.zig +0 -404
  552. package/src/zig/text-buffer-view.zig +0 -1371
  553. package/src/zig/text-buffer.zig +0 -1180
  554. package/src/zig/utf8.zig +0 -1948
  555. package/src/zig/utils.zig +0 -9
  556. package/src/zig-structs.ts +0 -261
  557. package/src/zig.ts +0 -3843
  558. package/tsconfig.build.json +0 -22
  559. package/tsconfig.json +0 -28
  560. /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
  561. /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
  562. /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
  563. /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
  564. /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
  565. /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
  566. /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  567. /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
  568. /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
  569. /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
  570. /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
@@ -1,1356 +0,0 @@
1
- import { describe, test, expect } from "bun:test"
2
- import { createMockKeys, KeyCodes } from "./mock-keys.js"
3
- import { PassThrough } from "stream"
4
-
5
- class MockRenderer {
6
- public stdin: PassThrough
7
- public emittedData: Buffer[] = []
8
-
9
- constructor() {
10
- this.stdin = new PassThrough()
11
-
12
- this.stdin.on("data", (chunk: Buffer) => {
13
- this.emittedData.push(chunk)
14
- })
15
- }
16
-
17
- getEmittedData(): string {
18
- return Buffer.concat(this.emittedData).toString()
19
- }
20
- }
21
-
22
- describe("mock-keys", () => {
23
- test("pressKeys with string keys", () => {
24
- const mockRenderer = new MockRenderer()
25
- const mockKeys = createMockKeys(mockRenderer as any)
26
-
27
- mockKeys.pressKeys(["h", "e", "l", "l", "o"])
28
-
29
- expect(mockRenderer.getEmittedData()).toBe("hello")
30
- })
31
-
32
- test("pressKeys with KeyCodes", () => {
33
- const mockRenderer = new MockRenderer()
34
- const mockKeys = createMockKeys(mockRenderer as any)
35
-
36
- mockKeys.pressKeys([KeyCodes.RETURN, KeyCodes.TAB])
37
-
38
- expect(mockRenderer.getEmittedData()).toBe("\r\t")
39
- })
40
-
41
- test("pressKey with string", () => {
42
- const mockRenderer = new MockRenderer()
43
- const mockKeys = createMockKeys(mockRenderer as any)
44
-
45
- mockKeys.pressKey("a")
46
-
47
- expect(mockRenderer.getEmittedData()).toBe("a")
48
- })
49
-
50
- test("pressKey with KeyCode", () => {
51
- const mockRenderer = new MockRenderer()
52
- const mockKeys = createMockKeys(mockRenderer as any)
53
-
54
- mockKeys.pressKey(KeyCodes.ESCAPE)
55
-
56
- expect(mockRenderer.getEmittedData()).toBe("\x1b")
57
- })
58
-
59
- test("typeText", () => {
60
- const mockRenderer = new MockRenderer()
61
- const mockKeys = createMockKeys(mockRenderer as any)
62
-
63
- mockKeys.typeText("hello world")
64
-
65
- expect(mockRenderer.getEmittedData()).toBe("hello world")
66
- })
67
-
68
- test("convenience methods", () => {
69
- const mockRenderer = new MockRenderer()
70
- const mockKeys = createMockKeys(mockRenderer as any)
71
-
72
- mockKeys.pressEnter()
73
- mockKeys.pressEscape()
74
- mockKeys.pressTab()
75
- mockKeys.pressBackspace()
76
-
77
- expect(mockRenderer.getEmittedData()).toBe("\r\x1b\t\b")
78
- })
79
-
80
- test("pressArrow", () => {
81
- const mockRenderer = new MockRenderer()
82
- const mockKeys = createMockKeys(mockRenderer as any)
83
-
84
- mockKeys.pressArrow("up")
85
- mockKeys.pressArrow("down")
86
- mockKeys.pressArrow("left")
87
- mockKeys.pressArrow("right")
88
-
89
- expect(mockRenderer.getEmittedData()).toBe("\x1b[A\x1b[B\x1b[D\x1b[C")
90
- })
91
-
92
- test("pressCtrlC", () => {
93
- const mockRenderer = new MockRenderer()
94
- const mockKeys = createMockKeys(mockRenderer as any)
95
-
96
- mockKeys.pressCtrlC()
97
-
98
- expect(mockRenderer.getEmittedData()).toBe("\x03")
99
- })
100
-
101
- test("arbitrary string keys work", () => {
102
- const mockRenderer = new MockRenderer()
103
- const mockKeys = createMockKeys(mockRenderer as any)
104
-
105
- mockKeys.pressKey("x")
106
- mockKeys.pressKey("y")
107
- mockKeys.pressKey("z")
108
-
109
- expect(mockRenderer.getEmittedData()).toBe("xyz")
110
- })
111
-
112
- test("KeyCodes enum values work", () => {
113
- const mockRenderer = new MockRenderer()
114
- const mockKeys = createMockKeys(mockRenderer as any)
115
-
116
- mockKeys.pressKey(KeyCodes.RETURN)
117
- mockKeys.pressKey(KeyCodes.TAB)
118
- mockKeys.pressKey(KeyCodes.ESCAPE)
119
-
120
- expect(mockRenderer.getEmittedData()).toBe("\r\t\x1b")
121
- })
122
-
123
- test("data events are properly emitted", () => {
124
- const mockRenderer = new MockRenderer()
125
- const mockKeys = createMockKeys(mockRenderer as any)
126
-
127
- const receivedData: Buffer[] = []
128
- mockRenderer.stdin.on("data", (chunk: Buffer) => {
129
- receivedData.push(chunk)
130
- })
131
-
132
- mockKeys.pressKey("a")
133
- mockKeys.pressKey(KeyCodes.RETURN)
134
-
135
- expect(receivedData).toHaveLength(2)
136
- expect(receivedData[0].toString()).toBe("a")
137
- expect(receivedData[1].toString()).toBe("\r")
138
- })
139
-
140
- test("multiple data events accumulate correctly", () => {
141
- const mockRenderer = new MockRenderer()
142
- const mockKeys = createMockKeys(mockRenderer as any)
143
-
144
- const receivedData: string[] = []
145
- mockRenderer.stdin.on("data", (chunk: Buffer) => {
146
- receivedData.push(chunk.toString())
147
- })
148
-
149
- mockKeys.typeText("hello")
150
- mockKeys.pressEnter()
151
-
152
- expect(receivedData).toEqual(["h", "e", "l", "l", "o", "\r"])
153
- })
154
-
155
- test("stream write method emits data events correctly", () => {
156
- const mockRenderer = new MockRenderer()
157
- const mockKeys = createMockKeys(mockRenderer as any)
158
-
159
- const emittedChunks: Buffer[] = []
160
- mockRenderer.stdin.on("data", (chunk: Buffer) => {
161
- emittedChunks.push(chunk)
162
- })
163
-
164
- // Directly test the stream write method that mock-keys uses
165
- mockRenderer.stdin.write("test")
166
- mockRenderer.stdin.write(KeyCodes.RETURN)
167
-
168
- expect(emittedChunks).toHaveLength(2)
169
- expect(emittedChunks[0].toString()).toBe("test")
170
- expect(emittedChunks[1].toString()).toBe("\r")
171
- })
172
-
173
- test("pressKeys with delay works", async () => {
174
- const mockRenderer = new MockRenderer()
175
- const mockKeys = createMockKeys(mockRenderer as any)
176
-
177
- const timestamps: number[] = []
178
- mockRenderer.stdin.on("data", () => {
179
- timestamps.push(Date.now())
180
- })
181
-
182
- const startTime = Date.now()
183
- await mockKeys.pressKeys(["a", "b"], 10) // 10ms delay between keys
184
- const totalElapsed = Date.now() - startTime
185
-
186
- expect(timestamps).toHaveLength(2)
187
- expect(timestamps[1] - timestamps[0]).toBeGreaterThanOrEqual(8) // Allow some tolerance
188
- expect(totalElapsed).toBeGreaterThanOrEqual(16)
189
- })
190
-
191
- test("pressKey with shift modifier", () => {
192
- const mockRenderer = new MockRenderer()
193
- const mockKeys = createMockKeys(mockRenderer as any)
194
-
195
- mockKeys.pressKey(KeyCodes.ARROW_RIGHT, { shift: true })
196
-
197
- // Arrow right with shift: \x1b[1;2C
198
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;2C")
199
- })
200
-
201
- test("pressKey with ctrl modifier", () => {
202
- const mockRenderer = new MockRenderer()
203
- const mockKeys = createMockKeys(mockRenderer as any)
204
-
205
- mockKeys.pressKey(KeyCodes.ARROW_LEFT, { ctrl: true })
206
-
207
- // Arrow left with ctrl: \x1b[1;5D (1 base + 4 ctrl = 5)
208
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;5D")
209
- })
210
-
211
- test("pressKey with shift+ctrl modifiers", () => {
212
- const mockRenderer = new MockRenderer()
213
- const mockKeys = createMockKeys(mockRenderer as any)
214
-
215
- mockKeys.pressKey(KeyCodes.ARROW_UP, { shift: true, ctrl: true })
216
-
217
- // Arrow up with shift+ctrl: \x1b[1;6A (1 base + 1 shift + 4 ctrl = 6)
218
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;6A")
219
- })
220
-
221
- test("pressKey with meta modifier", () => {
222
- const mockRenderer = new MockRenderer()
223
- const mockKeys = createMockKeys(mockRenderer as any)
224
-
225
- mockKeys.pressKey(KeyCodes.ARROW_DOWN, { meta: true })
226
-
227
- // Arrow down with meta: \x1b[1;3B (1 base + 2 meta = 3)
228
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;3B")
229
- })
230
-
231
- test("pressKey with super modifier", () => {
232
- const mockRenderer = new MockRenderer()
233
- const mockKeys = createMockKeys(mockRenderer as any)
234
-
235
- mockKeys.pressKey(KeyCodes.ARROW_UP, { super: true })
236
-
237
- // Arrow up with super: \x1b[1;9A (1 base + 8 super = 9)
238
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;9A")
239
- })
240
-
241
- test("pressKey with hyper modifier", () => {
242
- const mockRenderer = new MockRenderer()
243
- const mockKeys = createMockKeys(mockRenderer as any)
244
-
245
- mockKeys.pressKey(KeyCodes.ARROW_LEFT, { hyper: true })
246
-
247
- // Arrow left with hyper: \x1b[1;17D (1 base + 16 hyper = 17)
248
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;17D")
249
- })
250
-
251
- test("pressKey with super+hyper modifiers", () => {
252
- const mockRenderer = new MockRenderer()
253
- const mockKeys = createMockKeys(mockRenderer as any)
254
-
255
- mockKeys.pressKey(KeyCodes.ARROW_RIGHT, { super: true, hyper: true })
256
-
257
- // Arrow right with super+hyper: \x1b[1;25C (1 base + 8 super + 16 hyper = 25)
258
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;25C")
259
- })
260
-
261
- test("pressArrow with shift modifier", () => {
262
- const mockRenderer = new MockRenderer()
263
- const mockKeys = createMockKeys(mockRenderer as any)
264
-
265
- mockKeys.pressArrow("right", { shift: true })
266
-
267
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;2C")
268
- })
269
-
270
- test("pressArrow without modifiers still works", () => {
271
- const mockRenderer = new MockRenderer()
272
- const mockKeys = createMockKeys(mockRenderer as any)
273
-
274
- mockKeys.pressArrow("left")
275
-
276
- expect(mockRenderer.getEmittedData()).toBe("\x1b[D")
277
- })
278
-
279
- test("pressKey with modifiers on HOME key", () => {
280
- const mockRenderer = new MockRenderer()
281
- const mockKeys = createMockKeys(mockRenderer as any)
282
-
283
- mockKeys.pressKey(KeyCodes.HOME, { shift: true })
284
-
285
- // HOME with shift: \x1b[1;2H
286
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;2H")
287
- })
288
-
289
- test("pressKey with modifiers on END key", () => {
290
- const mockRenderer = new MockRenderer()
291
- const mockKeys = createMockKeys(mockRenderer as any)
292
-
293
- mockKeys.pressKey(KeyCodes.END, { shift: true })
294
-
295
- // END with shift: \x1b[1;2F
296
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;2F")
297
- })
298
-
299
- test("pressKey with meta on regular character", () => {
300
- const mockRenderer = new MockRenderer()
301
- const mockKeys = createMockKeys(mockRenderer as any)
302
-
303
- mockKeys.pressKey("a", { meta: true })
304
-
305
- // Meta+a: \x1ba (escape + a)
306
- expect(mockRenderer.getEmittedData()).toBe("\x1ba")
307
- })
308
-
309
- test("pressKey with meta+shift on character", () => {
310
- const mockRenderer = new MockRenderer()
311
- const mockKeys = createMockKeys(mockRenderer as any)
312
-
313
- mockKeys.pressKey("a", { meta: true, shift: true })
314
-
315
- // Meta+Shift+a: \x1bA (escape + uppercase A)
316
- expect(mockRenderer.getEmittedData()).toBe("\x1bA")
317
- })
318
-
319
- test("pressKey with meta+ctrl on arrow", () => {
320
- const mockRenderer = new MockRenderer()
321
- const mockKeys = createMockKeys(mockRenderer as any)
322
-
323
- mockKeys.pressKey(KeyCodes.ARROW_RIGHT, { meta: true, ctrl: true })
324
-
325
- // Arrow right with meta+ctrl: \x1b[1;7C (1 base + 2 meta + 4 ctrl = 7)
326
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;7C")
327
- })
328
-
329
- test("pressKey with meta+shift+ctrl on arrow", () => {
330
- const mockRenderer = new MockRenderer()
331
- const mockKeys = createMockKeys(mockRenderer as any)
332
-
333
- mockKeys.pressKey(KeyCodes.ARROW_UP, { meta: true, shift: true, ctrl: true })
334
-
335
- // Arrow up with all modifiers: \x1b[1;8A (1 base + 1 shift + 2 meta + 4 ctrl = 8)
336
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;8A")
337
- })
338
-
339
- test("pressArrow with meta modifier", () => {
340
- const mockRenderer = new MockRenderer()
341
- const mockKeys = createMockKeys(mockRenderer as any)
342
-
343
- mockKeys.pressArrow("left", { meta: true })
344
-
345
- // Arrow left with meta: \x1b[1;3D
346
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;3D")
347
- })
348
-
349
- test("pressArrow with meta+shift modifiers", () => {
350
- const mockRenderer = new MockRenderer()
351
- const mockKeys = createMockKeys(mockRenderer as any)
352
-
353
- mockKeys.pressArrow("down", { meta: true, shift: true })
354
-
355
- // Arrow down with meta+shift: \x1b[1;4B (1 base + 1 shift + 2 meta = 4)
356
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;4B")
357
- })
358
-
359
- test("meta modifier produces escape sequences", () => {
360
- const mockRenderer = new MockRenderer()
361
- const mockKeys = createMockKeys(mockRenderer as any)
362
-
363
- mockKeys.pressKey("a", { meta: true })
364
- mockKeys.pressKey("z", { meta: true })
365
-
366
- expect(mockRenderer.getEmittedData()).toBe("\x1ba\x1bz")
367
- })
368
-
369
- test("pressEnter with modifiers", () => {
370
- const mockRenderer = new MockRenderer()
371
- const mockKeys = createMockKeys(mockRenderer as any)
372
-
373
- mockKeys.pressEnter({ meta: true })
374
-
375
- expect(mockRenderer.getEmittedData()).toBe("\x1b\r")
376
- })
377
-
378
- test("pressTab with shift modifier", () => {
379
- const mockRenderer = new MockRenderer()
380
- const mockKeys = createMockKeys(mockRenderer as any)
381
-
382
- mockKeys.pressTab({ shift: true })
383
-
384
- expect(mockRenderer.getEmittedData()).toBe("\t")
385
- })
386
-
387
- test("pressEscape with ctrl modifier", () => {
388
- const mockRenderer = new MockRenderer()
389
- const mockKeys = createMockKeys(mockRenderer as any)
390
-
391
- mockKeys.pressEscape({ ctrl: true })
392
-
393
- expect(mockRenderer.getEmittedData()).toBe("\x1b")
394
- })
395
-
396
- test("pressBackspace with meta modifier", () => {
397
- const mockRenderer = new MockRenderer()
398
- const mockKeys = createMockKeys(mockRenderer as any)
399
-
400
- mockKeys.pressBackspace({ meta: true })
401
-
402
- expect(mockRenderer.getEmittedData()).toBe("\x1b\b")
403
- })
404
-
405
- test("pressKey with ctrl on letter produces control code", () => {
406
- const mockRenderer = new MockRenderer()
407
- const mockKeys = createMockKeys(mockRenderer as any)
408
-
409
- mockKeys.pressKey("a", { ctrl: true })
410
- mockKeys.pressKey("z", { ctrl: true })
411
-
412
- expect(mockRenderer.getEmittedData()).toBe("\x01\x1a")
413
- })
414
-
415
- test("pressKey with ctrl on uppercase letter", () => {
416
- const mockRenderer = new MockRenderer()
417
- const mockKeys = createMockKeys(mockRenderer as any)
418
-
419
- mockKeys.pressKey("A", { ctrl: true })
420
-
421
- expect(mockRenderer.getEmittedData()).toBe("\x01")
422
- })
423
-
424
- test("pressKey with ctrl+meta combination", () => {
425
- const mockRenderer = new MockRenderer()
426
- const mockKeys = createMockKeys(mockRenderer as any)
427
-
428
- mockKeys.pressKey("a", { ctrl: true, meta: true })
429
-
430
- expect(mockRenderer.getEmittedData()).toBe("\x1b\x01")
431
- })
432
-
433
- test("ctrl modifier produces control codes", () => {
434
- const mockRenderer = new MockRenderer()
435
- const mockKeys = createMockKeys(mockRenderer as any)
436
-
437
- mockKeys.pressKey("a", { ctrl: true })
438
- mockKeys.pressKey("c", { ctrl: true })
439
- mockKeys.pressKey("d", { ctrl: true })
440
-
441
- expect(mockRenderer.getEmittedData()).toBe("\x01\x03\x04")
442
- })
443
-
444
- test("meta modifier produces escape sequences", () => {
445
- const mockRenderer = new MockRenderer()
446
- const mockKeys = createMockKeys(mockRenderer as any)
447
-
448
- mockKeys.pressKey("a", { meta: true })
449
- mockKeys.pressKey("z", { meta: true })
450
-
451
- expect(mockRenderer.getEmittedData()).toBe("\x1ba\x1bz")
452
- })
453
-
454
- test("all CTRL_* letters produce correct control codes", () => {
455
- const mockRenderer = new MockRenderer()
456
- const mockKeys = createMockKeys(mockRenderer as any)
457
-
458
- const letters = "abcdefghijklmnopqrstuvwxyz"
459
- for (const letter of letters) {
460
- mockKeys.pressKey(letter, { ctrl: true })
461
- }
462
-
463
- const expected = letters
464
- .split("")
465
- .map((c) => String.fromCharCode(c.charCodeAt(0) - 96))
466
- .join("")
467
- expect(mockRenderer.getEmittedData()).toBe(expected)
468
- })
469
-
470
- test("pressKey with ctrl modifier produces control code", () => {
471
- const mockRenderer = new MockRenderer()
472
- const mockKeys = createMockKeys(mockRenderer as any)
473
- mockKeys.pressKey("c", { ctrl: true })
474
-
475
- expect(mockRenderer.getEmittedData()).toBe("\x03")
476
- })
477
-
478
- test("pressKey with meta modifier on letters produces escape sequences", () => {
479
- const mockRenderer = new MockRenderer()
480
- const mockKeys = createMockKeys(mockRenderer as any)
481
- mockKeys.pressKey("x", { meta: true })
482
-
483
- expect(mockRenderer.getEmittedData()).toBe("\x1bx")
484
- })
485
-
486
- test("pressKey with ctrl modifier on special characters", () => {
487
- const mockRenderer = new MockRenderer()
488
- const mockKeys = createMockKeys(mockRenderer as any)
489
-
490
- // Ctrl+- should produce \u001f (ASCII 31, Unit Separator)
491
- mockRenderer.emittedData = []
492
- mockKeys.pressKey("-", { ctrl: true })
493
- expect(mockRenderer.getEmittedData()).toBe("\u001f")
494
-
495
- // Ctrl+. should produce \u001e (ASCII 30, Record Separator)
496
- mockRenderer.emittedData = []
497
- mockKeys.pressKey(".", { ctrl: true })
498
- expect(mockRenderer.getEmittedData()).toBe("\u001e")
499
-
500
- // Ctrl+, should produce \u001c (ASCII 28, File Separator)
501
- mockRenderer.emittedData = []
502
- mockKeys.pressKey(",", { ctrl: true })
503
- expect(mockRenderer.getEmittedData()).toBe("\u001c")
504
-
505
- // Ctrl+] should produce \u001d (ASCII 29, Group Separator)
506
- mockRenderer.emittedData = []
507
- mockKeys.pressKey("]", { ctrl: true })
508
- expect(mockRenderer.getEmittedData()).toBe("\u001d")
509
-
510
- // Ctrl+[ should produce \x1b (ASCII 27, Escape)
511
- mockRenderer.emittedData = []
512
- mockKeys.pressKey("[", { ctrl: true })
513
- expect(mockRenderer.getEmittedData()).toBe("\x1b")
514
-
515
- // Ctrl+/ should produce \u001f (ASCII 31, same as Ctrl+-)
516
- mockRenderer.emittedData = []
517
- mockKeys.pressKey("/", { ctrl: true })
518
- expect(mockRenderer.getEmittedData()).toBe("\u001f")
519
-
520
- // Ctrl+_ should also produce \u001f (ASCII 31)
521
- mockRenderer.emittedData = []
522
- mockKeys.pressKey("_", { ctrl: true })
523
- expect(mockRenderer.getEmittedData()).toBe("\u001f")
524
- })
525
-
526
- test("pressKey with ctrl modifier on all special control characters", () => {
527
- const mockRenderer = new MockRenderer()
528
- const mockKeys = createMockKeys(mockRenderer as any)
529
-
530
- // Test all standard control character mappings
531
- const tests = [
532
- { key: "[", expected: "\x1b" }, // ESC
533
- { key: "\\", expected: "\x1c" }, // FS
534
- { key: "]", expected: "\x1d" }, // GS
535
- { key: "^", expected: "\x1e" }, // RS
536
- { key: "_", expected: "\x1f" }, // US
537
- { key: "?", expected: "\x7f" }, // DEL
538
- { key: "@", expected: "\x00" }, // NUL
539
- { key: " ", expected: "\x00" }, // NUL (Ctrl+Space)
540
- ]
541
-
542
- for (const { key, expected } of tests) {
543
- mockRenderer.emittedData = []
544
- mockKeys.pressKey(key, { ctrl: true })
545
- expect(mockRenderer.getEmittedData()).toBe(expected)
546
- }
547
- })
548
-
549
- test("pressKey with ctrl+meta on special characters", () => {
550
- const mockRenderer = new MockRenderer()
551
- const mockKeys = createMockKeys(mockRenderer as any)
552
-
553
- // Ctrl+Meta+- should produce ESC + \u001f
554
- mockRenderer.emittedData = []
555
- mockKeys.pressKey("-", { ctrl: true, meta: true })
556
- expect(mockRenderer.getEmittedData()).toBe("\x1b\u001f")
557
-
558
- // Ctrl+Meta+] should produce ESC + \u001d
559
- mockRenderer.emittedData = []
560
- mockKeys.pressKey("]", { ctrl: true, meta: true })
561
- expect(mockRenderer.getEmittedData()).toBe("\x1b\u001d")
562
- })
563
-
564
- test("pressKey with ctrl on special chars does NOT use kitty keyboard", () => {
565
- const mockRenderer = new MockRenderer()
566
- // Explicitly use non-kitty mode
567
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: false })
568
-
569
- mockKeys.pressKey("-", { ctrl: true })
570
-
571
- // Should produce raw control sequence, NOT kitty CSI u sequence
572
- const data = mockRenderer.getEmittedData()
573
- expect(data).toBe("\u001f")
574
- expect(data).not.toContain("[") // Should not contain CSI
575
- expect(data).not.toContain("u") // Should not contain kitty 'u' ending
576
- })
577
-
578
- test("comprehensive test: all punctuation keys work with ctrl modifier", () => {
579
- const mockRenderer = new MockRenderer()
580
- const mockKeys = createMockKeys(mockRenderer as any)
581
-
582
- // Test multiple punctuation keys in sequence
583
- mockKeys.pressKey("-", { ctrl: true })
584
- mockKeys.pressKey(".", { ctrl: true })
585
- mockKeys.pressKey(",", { ctrl: true })
586
- mockKeys.pressKey("]", { ctrl: true })
587
- mockKeys.pressKey("[", { ctrl: true })
588
-
589
- const expected = "\u001f\u001e\u001c\u001d\x1b"
590
- expect(mockRenderer.getEmittedData()).toBe(expected)
591
- })
592
-
593
- test("ctrl modifier with non-mapped characters preserves original", () => {
594
- const mockRenderer = new MockRenderer()
595
- const mockKeys = createMockKeys(mockRenderer as any)
596
-
597
- // Characters without specific ctrl mappings should be preserved
598
- // (though in real terminals they might not do anything)
599
- mockKeys.pressKey("(", { ctrl: true })
600
-
601
- // Should preserve the character since it's not in the mapping
602
- expect(mockRenderer.getEmittedData()).toBe("(")
603
- })
604
-
605
- describe("Kitty Keyboard Protocol Mode", () => {
606
- test("basic character in kitty mode", () => {
607
- const mockRenderer = new MockRenderer()
608
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
609
-
610
- mockKeys.pressKey("a")
611
-
612
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97u")
613
- })
614
-
615
- test("backspace without modifiers in kitty mode", () => {
616
- const mockRenderer = new MockRenderer()
617
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
618
-
619
- mockKeys.pressBackspace()
620
-
621
- expect(mockRenderer.getEmittedData()).toBe("\x1b[127u")
622
- })
623
-
624
- test("backspace with shift in kitty mode", () => {
625
- const mockRenderer = new MockRenderer()
626
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
627
-
628
- mockKeys.pressBackspace({ shift: true })
629
-
630
- // Kitty protocol: backspace(127) with shift modifier (1+1=2)
631
- expect(mockRenderer.getEmittedData()).toBe("\x1b[127;2u")
632
- })
633
-
634
- test("backspace with ctrl in kitty mode", () => {
635
- const mockRenderer = new MockRenderer()
636
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
637
-
638
- mockKeys.pressBackspace({ ctrl: true })
639
-
640
- // Kitty protocol: backspace(127) with ctrl modifier (4+1=5)
641
- expect(mockRenderer.getEmittedData()).toBe("\x1b[127;5u")
642
- })
643
-
644
- test("backspace with meta in kitty mode", () => {
645
- const mockRenderer = new MockRenderer()
646
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
647
-
648
- mockKeys.pressBackspace({ meta: true })
649
-
650
- // Kitty protocol: backspace(127) with meta modifier (2+1=3)
651
- expect(mockRenderer.getEmittedData()).toBe("\x1b[127;3u")
652
- })
653
-
654
- test("backspace with shift+meta in kitty mode", () => {
655
- const mockRenderer = new MockRenderer()
656
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
657
-
658
- mockKeys.pressBackspace({ shift: true, meta: true })
659
-
660
- // Kitty protocol: backspace(127) with shift+meta (1+2+1=4)
661
- expect(mockRenderer.getEmittedData()).toBe("\x1b[127;4u")
662
- })
663
-
664
- test("delete key in kitty mode", () => {
665
- const mockRenderer = new MockRenderer()
666
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
667
-
668
- mockKeys.pressKey("DELETE")
669
-
670
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57349u")
671
- })
672
-
673
- test("arrow keys in kitty mode", () => {
674
- const mockRenderer = new MockRenderer()
675
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
676
-
677
- mockKeys.pressArrow("up")
678
- mockKeys.pressArrow("down")
679
- mockKeys.pressArrow("left")
680
- mockKeys.pressArrow("right")
681
-
682
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57352u\x1b[57353u\x1b[57350u\x1b[57351u")
683
- })
684
-
685
- test("arrow key with shift in kitty mode", () => {
686
- const mockRenderer = new MockRenderer()
687
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
688
-
689
- mockKeys.pressArrow("right", { shift: true })
690
-
691
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57351;2u")
692
- })
693
-
694
- test("arrow key with ctrl in kitty mode", () => {
695
- const mockRenderer = new MockRenderer()
696
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
697
-
698
- mockKeys.pressArrow("left", { ctrl: true })
699
-
700
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57350;5u")
701
- })
702
-
703
- test("arrow key with meta in kitty mode", () => {
704
- const mockRenderer = new MockRenderer()
705
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
706
-
707
- mockKeys.pressArrow("down", { meta: true })
708
-
709
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57353;3u")
710
- })
711
-
712
- test("arrow key with shift+ctrl+meta in kitty mode", () => {
713
- const mockRenderer = new MockRenderer()
714
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
715
-
716
- mockKeys.pressArrow("up", { shift: true, ctrl: true, meta: true })
717
-
718
- // shift(1) + meta(2) + ctrl(4) = 7, plus 1 = 8
719
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57352;8u")
720
- })
721
-
722
- test("enter/return in kitty mode", () => {
723
- const mockRenderer = new MockRenderer()
724
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
725
-
726
- mockKeys.pressEnter()
727
-
728
- expect(mockRenderer.getEmittedData()).toBe("\x1b[13u")
729
- })
730
-
731
- test("enter with meta in kitty mode", () => {
732
- const mockRenderer = new MockRenderer()
733
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
734
-
735
- mockKeys.pressEnter({ meta: true })
736
-
737
- expect(mockRenderer.getEmittedData()).toBe("\x1b[13;3u")
738
- })
739
-
740
- test("tab in kitty mode", () => {
741
- const mockRenderer = new MockRenderer()
742
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
743
-
744
- mockKeys.pressTab()
745
-
746
- expect(mockRenderer.getEmittedData()).toBe("\x1b[9u")
747
- })
748
-
749
- test("tab with shift in kitty mode", () => {
750
- const mockRenderer = new MockRenderer()
751
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
752
-
753
- mockKeys.pressTab({ shift: true })
754
-
755
- expect(mockRenderer.getEmittedData()).toBe("\x1b[9;2u")
756
- })
757
-
758
- test("escape in kitty mode", () => {
759
- const mockRenderer = new MockRenderer()
760
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
761
-
762
- mockKeys.pressEscape()
763
-
764
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27u")
765
- })
766
-
767
- test("home key in kitty mode", () => {
768
- const mockRenderer = new MockRenderer()
769
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
770
-
771
- mockKeys.pressKey("HOME")
772
-
773
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57356u")
774
- })
775
-
776
- test("home with shift in kitty mode", () => {
777
- const mockRenderer = new MockRenderer()
778
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
779
-
780
- mockKeys.pressKey("HOME", { shift: true })
781
-
782
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57356;2u")
783
- })
784
-
785
- test("end key in kitty mode", () => {
786
- const mockRenderer = new MockRenderer()
787
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
788
-
789
- mockKeys.pressKey("END")
790
-
791
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57357u")
792
- })
793
-
794
- test("function keys in kitty mode", () => {
795
- const mockRenderer = new MockRenderer()
796
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
797
-
798
- mockKeys.pressKey("F1")
799
- mockKeys.pressKey("F2")
800
- mockKeys.pressKey("F12")
801
-
802
- expect(mockRenderer.getEmittedData()).toBe("\x1b[57364u\x1b[57365u\x1b[57375u")
803
- })
804
-
805
- test("regular characters with shift in kitty mode", () => {
806
- const mockRenderer = new MockRenderer()
807
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
808
-
809
- mockKeys.pressKey("a", { shift: true })
810
-
811
- // 'a' (97) with shift modifier
812
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;2u")
813
- })
814
-
815
- test("regular characters with ctrl in kitty mode", () => {
816
- const mockRenderer = new MockRenderer()
817
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
818
-
819
- mockKeys.pressKey("c", { ctrl: true })
820
-
821
- // 'c' (99) with ctrl modifier (4+1=5)
822
- expect(mockRenderer.getEmittedData()).toBe("\x1b[99;5u")
823
- })
824
-
825
- test("regular characters with meta in kitty mode", () => {
826
- const mockRenderer = new MockRenderer()
827
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
828
-
829
- mockKeys.pressKey("x", { meta: true })
830
-
831
- // 'x' (120) with meta modifier (2+1=3)
832
- expect(mockRenderer.getEmittedData()).toBe("\x1b[120;3u")
833
- })
834
-
835
- test("multiple keys in sequence in kitty mode", () => {
836
- const mockRenderer = new MockRenderer()
837
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
838
-
839
- mockKeys.pressKey("h")
840
- mockKeys.pressKey("i")
841
-
842
- expect(mockRenderer.getEmittedData()).toBe("\x1b[104u\x1b[105u")
843
- })
844
-
845
- test("mixed modifier combinations in kitty mode", () => {
846
- const mockRenderer = new MockRenderer()
847
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
848
-
849
- mockKeys.pressKey("a")
850
- mockKeys.pressKey("a", { shift: true })
851
- mockKeys.pressKey("a", { ctrl: true })
852
- mockKeys.pressKey("a", { meta: true })
853
- mockKeys.pressKey("a", { shift: true, ctrl: true })
854
-
855
- expect(mockRenderer.getEmittedData()).toBe(
856
- "\x1b[97u" + // no mods
857
- "\x1b[97;2u" + // shift
858
- "\x1b[97;5u" + // ctrl
859
- "\x1b[97;3u" + // meta
860
- "\x1b[97;6u", // shift+ctrl
861
- )
862
- })
863
-
864
- test("character with super modifier in kitty mode", () => {
865
- const mockRenderer = new MockRenderer()
866
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
867
-
868
- mockKeys.pressKey("a", { super: true })
869
-
870
- // 'a' (97) with super modifier (8+1=9)
871
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;9u")
872
- })
873
-
874
- test("character with hyper modifier in kitty mode", () => {
875
- const mockRenderer = new MockRenderer()
876
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
877
-
878
- mockKeys.pressKey("a", { hyper: true })
879
-
880
- // 'a' (97) with hyper modifier (16+1=17)
881
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;17u")
882
- })
883
-
884
- test("character with super+hyper modifiers in kitty mode", () => {
885
- const mockRenderer = new MockRenderer()
886
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
887
-
888
- mockKeys.pressKey("a", { super: true, hyper: true })
889
-
890
- // 'a' (97) with super+hyper (8+16+1=25)
891
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;25u")
892
- })
893
-
894
- test("character with all modifiers in kitty mode", () => {
895
- const mockRenderer = new MockRenderer()
896
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
897
-
898
- mockKeys.pressKey("a", { shift: true, ctrl: true, meta: true, super: true, hyper: true })
899
-
900
- // 'a' (97) with all modifiers: shift(1) + meta(2) + ctrl(4) + super(8) + hyper(16) = 31, +1 = 32
901
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;32u")
902
- })
903
-
904
- test("kitty mode vs regular mode comparison", () => {
905
- const kittyRenderer = new MockRenderer()
906
- const regularRenderer = new MockRenderer()
907
- const kittyKeys = createMockKeys(kittyRenderer as any, { kittyKeyboard: true })
908
- const regularKeys = createMockKeys(regularRenderer as any, { kittyKeyboard: false })
909
-
910
- kittyKeys.pressBackspace({ shift: true })
911
- regularKeys.pressBackspace({ shift: true })
912
-
913
- // Kitty should send the protocol sequence with modifier
914
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[127;2u")
915
- // Regular should just send backspace (shift is ignored)
916
- expect(regularRenderer.getEmittedData()).toBe("\b")
917
- })
918
-
919
- test("special characters with ctrl in kitty mode", () => {
920
- const kittyRenderer = new MockRenderer()
921
- const regularRenderer = new MockRenderer()
922
- const kittyKeys = createMockKeys(kittyRenderer as any, { kittyKeyboard: true })
923
- const regularKeys = createMockKeys(regularRenderer as any, { kittyKeyboard: false })
924
-
925
- // Test Ctrl+- in both modes
926
- kittyKeys.pressKey("-", { ctrl: true })
927
- regularKeys.pressKey("-", { ctrl: true })
928
-
929
- // Kitty should send the protocol sequence: '-' is codepoint 45, ctrl modifier is 4+1=5
930
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[45;5u")
931
- // Regular should send raw control sequence \u001f
932
- expect(regularRenderer.getEmittedData()).toBe("\u001f")
933
- })
934
-
935
- test("various special characters with ctrl in kitty mode", () => {
936
- const kittyRenderer = new MockRenderer()
937
- const kittyKeys = createMockKeys(kittyRenderer as any, { kittyKeyboard: true })
938
-
939
- // Test multiple special characters
940
- kittyRenderer.emittedData = []
941
- kittyKeys.pressKey(".", { ctrl: true })
942
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[46;5u") // '.' is codepoint 46
943
-
944
- kittyRenderer.emittedData = []
945
- kittyKeys.pressKey(",", { ctrl: true })
946
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[44;5u") // ',' is codepoint 44
947
-
948
- kittyRenderer.emittedData = []
949
- kittyKeys.pressKey("]", { ctrl: true })
950
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[93;5u") // ']' is codepoint 93
951
- })
952
- })
953
-
954
- describe("modifyOtherKeys Mode (CSI u variant)", () => {
955
- test("modifyOtherKeys sequences can be parsed by parseKeypress", async () => {
956
- const { parseKeypress } = await import("../lib/parse.keypress")
957
-
958
- // Test that our generated sequences can be parsed correctly
959
- const tests = [
960
- { seq: "\x1b[27;5;97~", expectedName: "a", expectedCtrl: true },
961
- { seq: "\x1b[27;2;13~", expectedName: "return", expectedShift: true },
962
- { seq: "\x1b[27;5;27~", expectedName: "escape", expectedCtrl: true },
963
- { seq: "\x1b[27;2;9~", expectedName: "tab", expectedShift: true },
964
- { seq: "\x1b[27;5;32~", expectedName: "space", expectedCtrl: true },
965
- { seq: "\x1b[27;6;97~", expectedName: "a", expectedShift: true, expectedCtrl: true },
966
- ]
967
-
968
- for (const test of tests) {
969
- const result = parseKeypress(test.seq)
970
- expect(result).not.toBeNull()
971
- expect(result?.name).toBe(test.expectedName)
972
- if (test.expectedCtrl !== undefined) {
973
- expect(result?.ctrl).toBe(test.expectedCtrl)
974
- }
975
- if (test.expectedShift !== undefined) {
976
- expect(result?.shift).toBe(test.expectedShift)
977
- }
978
- }
979
- })
980
-
981
- test("basic character without modifiers in modifyOtherKeys mode", () => {
982
- const mockRenderer = new MockRenderer()
983
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
984
-
985
- mockKeys.pressKey("a")
986
-
987
- // Without modifiers, should send plain character
988
- expect(mockRenderer.getEmittedData()).toBe("a")
989
- })
990
-
991
- test("character with ctrl in modifyOtherKeys mode", () => {
992
- const mockRenderer = new MockRenderer()
993
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
994
-
995
- mockKeys.pressKey("a", { ctrl: true })
996
-
997
- // modifyOtherKeys format: CSI 27 ; modifier ; code ~
998
- // 'a' is charCode 97, ctrl is 4, modifier is 4+1=5
999
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;97~")
1000
- })
1001
-
1002
- test("character with shift in modifyOtherKeys mode", () => {
1003
- const mockRenderer = new MockRenderer()
1004
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1005
-
1006
- mockKeys.pressKey("a", { shift: true })
1007
-
1008
- // 'a' is charCode 97, shift is 1, modifier is 1+1=2
1009
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;2;97~")
1010
- })
1011
-
1012
- test("character with meta in modifyOtherKeys mode", () => {
1013
- const mockRenderer = new MockRenderer()
1014
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1015
-
1016
- mockKeys.pressKey("a", { meta: true })
1017
-
1018
- // 'a' is charCode 97, meta is 2, modifier is 2+1=3
1019
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;3;97~")
1020
- })
1021
-
1022
- test("return/enter with ctrl in modifyOtherKeys mode", () => {
1023
- const mockRenderer = new MockRenderer()
1024
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1025
-
1026
- mockKeys.pressEnter({ ctrl: true })
1027
-
1028
- // return is charCode 13, ctrl is 4, modifier is 4+1=5
1029
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;13~")
1030
- })
1031
-
1032
- test("return with shift in modifyOtherKeys mode", () => {
1033
- const mockRenderer = new MockRenderer()
1034
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1035
-
1036
- mockKeys.pressEnter({ shift: true })
1037
-
1038
- // return is charCode 13, shift is 1, modifier is 1+1=2
1039
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;2;13~")
1040
- })
1041
-
1042
- test("escape with ctrl in modifyOtherKeys mode", () => {
1043
- const mockRenderer = new MockRenderer()
1044
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1045
-
1046
- mockKeys.pressEscape({ ctrl: true })
1047
-
1048
- // escape is charCode 27, ctrl is 4, modifier is 4+1=5
1049
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;27~")
1050
- })
1051
-
1052
- test("tab with ctrl in modifyOtherKeys mode", () => {
1053
- const mockRenderer = new MockRenderer()
1054
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1055
-
1056
- mockKeys.pressTab({ ctrl: true })
1057
-
1058
- // tab is charCode 9, ctrl is 4, modifier is 4+1=5
1059
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;9~")
1060
- })
1061
-
1062
- test("tab with shift in modifyOtherKeys mode", () => {
1063
- const mockRenderer = new MockRenderer()
1064
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1065
-
1066
- mockKeys.pressTab({ shift: true })
1067
-
1068
- // tab is charCode 9, shift is 1, modifier is 1+1=2
1069
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;2;9~")
1070
- })
1071
-
1072
- test("backspace with ctrl in modifyOtherKeys mode", () => {
1073
- const mockRenderer = new MockRenderer()
1074
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1075
-
1076
- mockKeys.pressBackspace({ ctrl: true })
1077
-
1078
- // backspace is charCode 127, ctrl is 4, modifier is 4+1=5
1079
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;127~")
1080
- })
1081
-
1082
- test("backspace with meta in modifyOtherKeys mode", () => {
1083
- const mockRenderer = new MockRenderer()
1084
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1085
-
1086
- mockKeys.pressBackspace({ meta: true })
1087
-
1088
- // backspace is charCode 127, meta is 2, modifier is 2+1=3
1089
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;3;127~")
1090
- })
1091
-
1092
- test("space with ctrl in modifyOtherKeys mode", () => {
1093
- const mockRenderer = new MockRenderer()
1094
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1095
-
1096
- mockKeys.pressKey(" ", { ctrl: true })
1097
-
1098
- // space is charCode 32, ctrl is 4, modifier is 4+1=5
1099
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;32~")
1100
- })
1101
-
1102
- test("special characters with ctrl in modifyOtherKeys mode", () => {
1103
- const mockRenderer = new MockRenderer()
1104
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1105
-
1106
- // Ctrl+- should use modifyOtherKeys format
1107
- mockRenderer.emittedData = []
1108
- mockKeys.pressKey("-", { ctrl: true })
1109
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;45~") // '-' is charCode 45
1110
-
1111
- // Ctrl+. should use modifyOtherKeys format
1112
- mockRenderer.emittedData = []
1113
- mockKeys.pressKey(".", { ctrl: true })
1114
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;46~") // '.' is charCode 46
1115
-
1116
- // Ctrl+, should use modifyOtherKeys format
1117
- mockRenderer.emittedData = []
1118
- mockKeys.pressKey(",", { ctrl: true })
1119
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;44~") // ',' is charCode 44
1120
-
1121
- // Ctrl+] should use modifyOtherKeys format
1122
- mockRenderer.emittedData = []
1123
- mockKeys.pressKey("]", { ctrl: true })
1124
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;93~") // ']' is charCode 93
1125
- })
1126
-
1127
- test("multiple modifier combinations in modifyOtherKeys mode", () => {
1128
- const mockRenderer = new MockRenderer()
1129
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1130
-
1131
- // shift + ctrl: 1 + 4 = 5, + 1 = 6
1132
- mockRenderer.emittedData = []
1133
- mockKeys.pressKey("a", { shift: true, ctrl: true })
1134
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;6;97~")
1135
-
1136
- // shift + meta: 1 + 2 = 3, + 1 = 4
1137
- mockRenderer.emittedData = []
1138
- mockKeys.pressKey("a", { shift: true, meta: true })
1139
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;4;97~")
1140
-
1141
- // ctrl + meta: 4 + 2 = 6, + 1 = 7
1142
- mockRenderer.emittedData = []
1143
- mockKeys.pressKey("a", { ctrl: true, meta: true })
1144
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;7;97~")
1145
-
1146
- // shift + ctrl + meta: 1 + 4 + 2 = 7, + 1 = 8
1147
- mockRenderer.emittedData = []
1148
- mockKeys.pressKey("a", { shift: true, ctrl: true, meta: true })
1149
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;8;97~")
1150
- })
1151
-
1152
- test("character with super modifier in modifyOtherKeys mode", () => {
1153
- const mockRenderer = new MockRenderer()
1154
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1155
-
1156
- mockKeys.pressKey("a", { super: true })
1157
-
1158
- // 'a' is charCode 97, super is 8, modifier is 8+1=9
1159
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;9;97~")
1160
- })
1161
-
1162
- test("character with hyper modifier in modifyOtherKeys mode", () => {
1163
- const mockRenderer = new MockRenderer()
1164
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1165
-
1166
- mockKeys.pressKey("a", { hyper: true })
1167
-
1168
- // 'a' is charCode 97, hyper is 16, modifier is 16+1=17
1169
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;17;97~")
1170
- })
1171
-
1172
- test("character with super+hyper modifiers in modifyOtherKeys mode", () => {
1173
- const mockRenderer = new MockRenderer()
1174
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1175
-
1176
- mockKeys.pressKey("a", { super: true, hyper: true })
1177
-
1178
- // super(8) + hyper(16) = 24, +1 = 25
1179
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;25;97~")
1180
- })
1181
-
1182
- test("character with all modifiers in modifyOtherKeys mode", () => {
1183
- const mockRenderer = new MockRenderer()
1184
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1185
-
1186
- mockKeys.pressKey("a", { shift: true, ctrl: true, meta: true, super: true, hyper: true })
1187
-
1188
- // shift(1) + meta(2) + ctrl(4) + super(8) + hyper(16) = 31, +1 = 32
1189
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;32;97~")
1190
- })
1191
-
1192
- test("arrow keys with modifiers fall through to regular mode in modifyOtherKeys", () => {
1193
- const mockRenderer = new MockRenderer()
1194
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1195
-
1196
- // Arrow keys should still use the standard CSI sequence with modifiers
1197
- // not the modifyOtherKeys format
1198
- mockKeys.pressArrow("right", { shift: true })
1199
-
1200
- expect(mockRenderer.getEmittedData()).toBe("\x1b[1;2C")
1201
- })
1202
-
1203
- test("kitty mode takes precedence over modifyOtherKeys mode", () => {
1204
- const mockRenderer = new MockRenderer()
1205
- const mockKeys = createMockKeys(mockRenderer as any, {
1206
- kittyKeyboard: true,
1207
- otherModifiersMode: true,
1208
- })
1209
-
1210
- mockKeys.pressKey("a", { ctrl: true })
1211
-
1212
- // Should use kitty format, not modifyOtherKeys
1213
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;5u")
1214
- })
1215
-
1216
- test("modifyOtherKeys vs regular mode comparison", () => {
1217
- const modifyOtherKeysRenderer = new MockRenderer()
1218
- const regularRenderer = new MockRenderer()
1219
- const modifyOtherKeysKeys = createMockKeys(modifyOtherKeysRenderer as any, { otherModifiersMode: true })
1220
- const regularKeys = createMockKeys(regularRenderer as any, { otherModifiersMode: false })
1221
-
1222
- modifyOtherKeysKeys.pressKey("-", { ctrl: true })
1223
- regularKeys.pressKey("-", { ctrl: true })
1224
-
1225
- // modifyOtherKeys should send CSI 27 format
1226
- expect(modifyOtherKeysRenderer.getEmittedData()).toBe("\x1b[27;5;45~")
1227
- // Regular should send raw control sequence
1228
- expect(regularRenderer.getEmittedData()).toBe("\u001f")
1229
- })
1230
-
1231
- test("characters without modifiers don't use modifyOtherKeys format", () => {
1232
- const mockRenderer = new MockRenderer()
1233
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1234
-
1235
- // Without modifiers, should send plain characters
1236
- mockKeys.pressKey("a")
1237
- mockKeys.pressKey("b")
1238
- mockKeys.pressEnter()
1239
-
1240
- expect(mockRenderer.getEmittedData()).toBe("ab\r")
1241
- })
1242
-
1243
- test("modifyOtherKeys with all printable characters", () => {
1244
- const mockRenderer = new MockRenderer()
1245
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1246
-
1247
- const chars = "abcdefghijklmnopqrstuvwxyz0123456789-=[]\\;',./`"
1248
-
1249
- for (const char of chars) {
1250
- mockRenderer.emittedData = []
1251
- mockKeys.pressKey(char, { ctrl: true })
1252
- const charCode = char.charCodeAt(0)
1253
- expect(mockRenderer.getEmittedData()).toBe(`\x1b[27;5;${charCode}~`)
1254
- }
1255
- })
1256
-
1257
- test("modifyOtherKeys mode can be parsed back correctly", () => {
1258
- const mockRenderer = new MockRenderer()
1259
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1260
-
1261
- // Test various keys with modifiers
1262
- const tests = [
1263
- { key: "a", mods: { ctrl: true }, expectedSeq: "\x1b[27;5;97~" },
1264
- { key: "-", mods: { ctrl: true }, expectedSeq: "\x1b[27;5;45~" },
1265
- { key: KeyCodes.RETURN, mods: { shift: true }, expectedSeq: "\x1b[27;2;13~" },
1266
- { key: KeyCodes.ESCAPE, mods: { ctrl: true }, expectedSeq: "\x1b[27;5;27~" },
1267
- { key: KeyCodes.TAB, mods: { shift: true }, expectedSeq: "\x1b[27;2;9~" },
1268
- { key: " ", mods: { ctrl: true }, expectedSeq: "\x1b[27;5;32~" },
1269
- ]
1270
-
1271
- for (const { key, mods, expectedSeq } of tests) {
1272
- mockRenderer.emittedData = []
1273
- mockKeys.pressKey(key, mods)
1274
- expect(mockRenderer.getEmittedData()).toBe(expectedSeq)
1275
- }
1276
- })
1277
-
1278
- test("comprehensive three-mode comparison: regular vs modifyOtherKeys vs kitty", () => {
1279
- const regularRenderer = new MockRenderer()
1280
- const modifyOtherKeysRenderer = new MockRenderer()
1281
- const kittyRenderer = new MockRenderer()
1282
-
1283
- const regularKeys = createMockKeys(regularRenderer as any, { kittyKeyboard: false, otherModifiersMode: false })
1284
- const modifyOtherKeysKeys = createMockKeys(modifyOtherKeysRenderer as any, { otherModifiersMode: true })
1285
- const kittyKeys = createMockKeys(kittyRenderer as any, { kittyKeyboard: true })
1286
-
1287
- // Test Ctrl+- in all three modes
1288
- regularKeys.pressKey("-", { ctrl: true })
1289
- modifyOtherKeysKeys.pressKey("-", { ctrl: true })
1290
- kittyKeys.pressKey("-", { ctrl: true })
1291
-
1292
- expect(regularRenderer.getEmittedData()).toBe("\u001f") // Raw control sequence
1293
- expect(modifyOtherKeysRenderer.getEmittedData()).toBe("\x1b[27;5;45~") // modifyOtherKeys format
1294
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[45;5u") // Kitty format
1295
-
1296
- // Test Shift+Enter in all three modes
1297
- regularRenderer.emittedData = []
1298
- modifyOtherKeysRenderer.emittedData = []
1299
- kittyRenderer.emittedData = []
1300
-
1301
- regularKeys.pressEnter({ shift: true })
1302
- modifyOtherKeysKeys.pressEnter({ shift: true })
1303
- kittyKeys.pressEnter({ shift: true })
1304
-
1305
- expect(regularRenderer.getEmittedData()).toBe("\r") // Regular mode ignores shift on Enter
1306
- expect(modifyOtherKeysRenderer.getEmittedData()).toBe("\x1b[27;2;13~") // modifyOtherKeys format
1307
- expect(kittyRenderer.getEmittedData()).toBe("\x1b[13;2u") // Kitty format
1308
- })
1309
- })
1310
-
1311
- describe("Mode selection and precedence", () => {
1312
- test("default mode (no options)", () => {
1313
- const mockRenderer = new MockRenderer()
1314
- const mockKeys = createMockKeys(mockRenderer as any)
1315
-
1316
- mockKeys.pressKey("-", { ctrl: true })
1317
-
1318
- // Default should use raw control sequences
1319
- expect(mockRenderer.getEmittedData()).toBe("\u001f")
1320
- })
1321
-
1322
- test("only kittyKeyboard enabled", () => {
1323
- const mockRenderer = new MockRenderer()
1324
- const mockKeys = createMockKeys(mockRenderer as any, { kittyKeyboard: true })
1325
-
1326
- mockKeys.pressKey("a", { ctrl: true })
1327
-
1328
- // Should use kitty format
1329
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;5u")
1330
- })
1331
-
1332
- test("only otherModifiersMode enabled", () => {
1333
- const mockRenderer = new MockRenderer()
1334
- const mockKeys = createMockKeys(mockRenderer as any, { otherModifiersMode: true })
1335
-
1336
- mockKeys.pressKey("a", { ctrl: true })
1337
-
1338
- // Should use modifyOtherKeys format
1339
- expect(mockRenderer.getEmittedData()).toBe("\x1b[27;5;97~")
1340
- })
1341
-
1342
- test("both kittyKeyboard and otherModifiersMode enabled (kitty wins)", () => {
1343
- const mockRenderer = new MockRenderer()
1344
- const mockKeys = createMockKeys(mockRenderer as any, {
1345
- kittyKeyboard: true,
1346
- otherModifiersMode: true,
1347
- })
1348
-
1349
- mockKeys.pressKey("a", { ctrl: true })
1350
-
1351
- // Kitty should take precedence
1352
- expect(mockRenderer.getEmittedData()).toBe("\x1b[97;5u")
1353
- expect(mockRenderer.getEmittedData()).not.toContain("27;5;97~")
1354
- })
1355
- })
1356
- })