@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,267 +0,0 @@
1
- const std = @import("std");
2
- const testing = std.testing;
3
- const utf8 = @import("../utf8.zig");
4
-
5
- test "wcwidth: cursor movement through emoji with skin tone" {
6
- const text = "πŸ‘‹πŸΏ"; // Wave + dark skin tone = 4 columns
7
-
8
- const width_wave = utf8.getWidthAt(text, 0, 4, .wcwidth);
9
- try testing.expectEqual(@as(u32, 2), width_wave);
10
-
11
- const width_skin = utf8.getWidthAt(text, 4, 4, .wcwidth);
12
- try testing.expectEqual(@as(u32, 2), width_skin);
13
-
14
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
15
- try testing.expectEqual(@as(u32, 4), total);
16
- }
17
-
18
- test "wcwidth: cursor movement through ZWJ sequence" {
19
- const text = "πŸ‘©β€πŸš€"; // Woman + ZWJ + Rocket = 4 columns (2+0+2)
20
-
21
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
22
- try testing.expectEqual(@as(u32, 4), total);
23
-
24
- const width_woman = utf8.getWidthAt(text, 0, 4, .wcwidth);
25
- try testing.expectEqual(@as(u32, 2), width_woman);
26
-
27
- const width_zwj = utf8.getWidthAt(text, 4, 4, .wcwidth);
28
- try testing.expectEqual(@as(u32, 0), width_zwj);
29
-
30
- const width_rocket = utf8.getWidthAt(text, 7, 4, .wcwidth);
31
- try testing.expectEqual(@as(u32, 2), width_rocket);
32
- }
33
-
34
- test "wcwidth: cursor movement through family emoji" {
35
- const text = "πŸ‘¨β€πŸ‘©β€πŸ‘§"; // Man + ZWJ + Woman + ZWJ + Girl = 6 columns (2+0+2+0+2)
36
-
37
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
38
- try testing.expectEqual(@as(u32, 6), total);
39
-
40
- const width_man = utf8.getWidthAt(text, 0, 4, .wcwidth);
41
- try testing.expectEqual(@as(u32, 2), width_man);
42
-
43
- const width_zwj1 = utf8.getWidthAt(text, 4, 4, .wcwidth);
44
- try testing.expectEqual(@as(u32, 0), width_zwj1);
45
-
46
- const width_woman = utf8.getWidthAt(text, 7, 4, .wcwidth);
47
- try testing.expectEqual(@as(u32, 2), width_woman);
48
-
49
- const width_zwj2 = utf8.getWidthAt(text, 11, 4, .wcwidth);
50
- try testing.expectEqual(@as(u32, 0), width_zwj2);
51
-
52
- const width_girl = utf8.getWidthAt(text, 14, 4, .wcwidth);
53
- try testing.expectEqual(@as(u32, 2), width_girl);
54
- }
55
-
56
- test "wcwidth: getPrevGraphemeStart through emoji with skin tone" {
57
- const text = "AπŸ‘‹πŸΏB"; // A(1) + πŸ‘‹(2) + 🏿(2) + B(1) = 6 columns
58
-
59
- const r_end = utf8.getPrevGraphemeStart(text, text.len, 4, .wcwidth);
60
- try testing.expect(r_end != null);
61
- try testing.expectEqual(@as(u32, 1), r_end.?.width);
62
-
63
- const r_b = utf8.getPrevGraphemeStart(text, r_end.?.start_offset, 4, .wcwidth);
64
- try testing.expect(r_b != null);
65
- try testing.expectEqual(@as(u32, 2), r_b.?.width);
66
-
67
- const r_skin = utf8.getPrevGraphemeStart(text, r_b.?.start_offset, 4, .wcwidth);
68
- try testing.expect(r_skin != null);
69
- try testing.expectEqual(@as(u32, 2), r_skin.?.width);
70
-
71
- const r_wave = utf8.getPrevGraphemeStart(text, r_skin.?.start_offset, 4, .wcwidth);
72
- try testing.expect(r_wave != null);
73
- try testing.expectEqual(@as(u32, 1), r_wave.?.width);
74
- }
75
-
76
- test "wcwidth: getPrevGraphemeStart through ZWJ sequence" {
77
- const text = "XπŸ‘©β€πŸš€Y"; // X(1) + πŸ‘©(2) + ZWJ(0) + πŸš€(2) + Y(1) = 6 columns
78
-
79
- const r_end = utf8.getPrevGraphemeStart(text, text.len, 4, .wcwidth);
80
- try testing.expect(r_end != null);
81
- try testing.expectEqual(@as(u32, 1), r_end.?.width);
82
-
83
- const r_y = utf8.getPrevGraphemeStart(text, r_end.?.start_offset, 4, .wcwidth);
84
- try testing.expect(r_y != null);
85
- try testing.expectEqual(@as(u32, 2), r_y.?.width);
86
-
87
- const r_rocket = utf8.getPrevGraphemeStart(text, r_y.?.start_offset, 4, .wcwidth);
88
- try testing.expect(r_rocket != null);
89
- try testing.expectEqual(@as(u32, 2), r_rocket.?.width);
90
-
91
- const r_woman = utf8.getPrevGraphemeStart(text, r_rocket.?.start_offset, 4, .wcwidth);
92
- try testing.expect(r_woman != null);
93
- try testing.expectEqual(@as(u32, 1), r_woman.?.width);
94
- }
95
-
96
- test "wcwidth: findPosByWidth through emoji sequence" {
97
- const text = "ABπŸ‘‹πŸΏCD"; // A(1) B(1) πŸ‘‹(2) 🏿(2) C(1) D(1) = 8 columns
98
-
99
- const pos_start = utf8.findPosByWidth(text, 3, 4, false, false, .wcwidth);
100
- try testing.expectEqual(@as(u32, 2), pos_start.byte_offset);
101
-
102
- const pos_end = utf8.findPosByWidth(text, 3, 4, false, true, .wcwidth);
103
- try testing.expectEqual(@as(u32, 6), pos_end.byte_offset);
104
- }
105
-
106
- test "wcwidth: findWrapPosByWidth through emoji" {
107
- const text = "HiπŸ‘‹πŸΏBye"; // H(1) i(1) πŸ‘‹(2) 🏿(2) B(1) y(1) e(1) = 10 columns
108
-
109
- const wrap_4 = utf8.findWrapPosByWidth(text, 4, 4, false, .wcwidth);
110
- try testing.expectEqual(@as(u32, 6), wrap_4.byte_offset);
111
- try testing.expectEqual(@as(u32, 4), wrap_4.columns_used);
112
-
113
- const wrap_5 = utf8.findWrapPosByWidth(text, 5, 4, false, .wcwidth);
114
- try testing.expectEqual(@as(u32, 6), wrap_5.byte_offset);
115
- try testing.expectEqual(@as(u32, 4), wrap_5.columns_used);
116
-
117
- const wrap_6 = utf8.findWrapPosByWidth(text, 6, 4, false, .wcwidth);
118
- try testing.expectEqual(@as(u32, 10), wrap_6.byte_offset);
119
- try testing.expectEqual(@as(u32, 6), wrap_6.columns_used);
120
- }
121
-
122
- test "wcwidth: combining marks have zero width" {
123
- const text = "e\u{0301}"; // e + combining acute
124
-
125
- const width_e = utf8.getWidthAt(text, 0, 4, .wcwidth);
126
- try testing.expectEqual(@as(u32, 1), width_e);
127
-
128
- const width_combining = utf8.getWidthAt(text, 1, 4, .wcwidth);
129
- try testing.expectEqual(@as(u32, 0), width_combining);
130
-
131
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
132
- try testing.expectEqual(@as(u32, 1), total);
133
- }
134
-
135
- test "wcwidth: CJK characters have width 2" {
136
- const text = "δ½ ε₯½δΈ–η•Œ"; // 4 CJK characters
137
-
138
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
139
- try testing.expectEqual(@as(u32, 8), total);
140
-
141
- const width_char1 = utf8.getWidthAt(text, 0, 4, .wcwidth);
142
- try testing.expectEqual(@as(u32, 2), width_char1);
143
-
144
- const width_char2 = utf8.getWidthAt(text, 3, 4, .wcwidth);
145
- try testing.expectEqual(@as(u32, 2), width_char2);
146
- }
147
-
148
- test "wcwidth: variation selectors have zero width" {
149
- const text = "☺\u{FE0F}"; // Smiling face + VS16
150
-
151
- const width_face = utf8.getWidthAt(text, 0, 4, .wcwidth);
152
- try testing.expectEqual(@as(u32, 1), width_face);
153
-
154
- const width_vs = utf8.getWidthAt(text, 3, 4, .wcwidth);
155
- try testing.expectEqual(@as(u32, 0), width_vs);
156
-
157
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
158
- try testing.expectEqual(@as(u32, 1), total);
159
- }
160
-
161
- test "wcwidth: flag emoji counts both regional indicators" {
162
- const text = "πŸ‡ΊπŸ‡Έ"; // US flag (two regional indicators)
163
-
164
- const width_ri1 = utf8.getWidthAt(text, 0, 4, .wcwidth);
165
- try testing.expectEqual(@as(u32, 1), width_ri1);
166
-
167
- const width_ri2 = utf8.getWidthAt(text, 4, 4, .wcwidth);
168
- try testing.expectEqual(@as(u32, 1), width_ri2);
169
-
170
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
171
- try testing.expectEqual(@as(u32, 2), total);
172
- }
173
-
174
- test "wcwidth: mixed content with cursor movement" {
175
- const text = "AπŸ‘‹πŸΏBδΈ–C"; // A(1) πŸ‘‹(2) 🏿(2) B(1) δΈ–(2) C(1) = 9 columns
176
-
177
- const r_end = utf8.getPrevGraphemeStart(text, text.len, 4, .wcwidth);
178
- try testing.expect(r_end != null);
179
- try testing.expectEqual(@as(u32, 1), r_end.?.width);
180
-
181
- const r_cjk = utf8.getPrevGraphemeStart(text, r_end.?.start_offset, 4, .wcwidth);
182
- try testing.expect(r_cjk != null);
183
- try testing.expectEqual(@as(u32, 2), r_cjk.?.width);
184
-
185
- const r_b = utf8.getPrevGraphemeStart(text, r_cjk.?.start_offset, 4, .wcwidth);
186
- try testing.expect(r_b != null);
187
- try testing.expectEqual(@as(u32, 1), r_b.?.width);
188
-
189
- const r_skin = utf8.getPrevGraphemeStart(text, r_b.?.start_offset, 4, .wcwidth);
190
- try testing.expect(r_skin != null);
191
- try testing.expectEqual(@as(u32, 2), r_skin.?.width);
192
-
193
- const r_wave = utf8.getPrevGraphemeStart(text, r_skin.?.start_offset, 4, .wcwidth);
194
- try testing.expect(r_wave != null);
195
- try testing.expectEqual(@as(u32, 2), r_wave.?.width);
196
-
197
- const r_a = utf8.getPrevGraphemeStart(text, r_wave.?.start_offset, 4, .wcwidth);
198
- try testing.expect(r_a != null);
199
- try testing.expectEqual(@as(u32, 1), r_a.?.width);
200
- }
201
-
202
- test "wcwidth: findGraphemeInfo with emoji" {
203
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
204
- defer result.deinit(testing.allocator);
205
-
206
- const text = "πŸ‘‹πŸΏ"; // Wave + skin tone modifier
207
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
208
-
209
- try testing.expectEqual(@as(usize, 1), result.items.len);
210
-
211
- try testing.expectEqual(@as(u32, 0), result.items[0].byte_offset);
212
- try testing.expectEqual(@as(u8, 8), result.items[0].byte_len);
213
- try testing.expectEqual(@as(u8, 4), result.items[0].width);
214
- }
215
-
216
- test "wcwidth: findGraphemeInfo with ZWJ sequence" {
217
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
218
- defer result.deinit(testing.allocator);
219
-
220
- const text = "πŸ‘©β€πŸš€"; // Woman + ZWJ + Rocket
221
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
222
-
223
- try testing.expectEqual(@as(usize, 1), result.items.len);
224
-
225
- try testing.expectEqual(@as(u32, 0), result.items[0].byte_offset);
226
- try testing.expectEqual(@as(u8, 11), result.items[0].byte_len);
227
- try testing.expectEqual(@as(u8, 4), result.items[0].width);
228
- }
229
-
230
- test "wcwidth: findGraphemeInfo with combining marks" {
231
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
232
- defer result.deinit(testing.allocator);
233
-
234
- const text = "e\u{0301}"; // e + combining acute
235
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
236
-
237
- try testing.expectEqual(@as(usize, 1), result.items.len);
238
- try testing.expectEqual(@as(u32, 0), result.items[0].byte_offset);
239
- try testing.expectEqual(@as(u8, 3), result.items[0].byte_len);
240
- try testing.expectEqual(@as(u8, 1), result.items[0].width);
241
- }
242
-
243
- test "wcwidth: tab width handling" {
244
- const text = "A\tB"; // A + tab + B
245
-
246
- const total = utf8.calculateTextWidth(text, 4, false, .wcwidth);
247
- try testing.expectEqual(@as(u32, 6), total);
248
-
249
- const tab_width = utf8.getWidthAt(text, 1, 4, .wcwidth);
250
- try testing.expectEqual(@as(u32, 4), tab_width);
251
- }
252
-
253
- test "wcwidth: boundary at wide character" {
254
- const text = "δΈ–X"; // δΈ–(2) X(1) = 3 columns
255
-
256
- const pos_start = utf8.findPosByWidth(text, 2, 4, false, false, .wcwidth);
257
- try testing.expectEqual(@as(u32, 3), pos_start.byte_offset);
258
- try testing.expectEqual(@as(u32, 2), pos_start.columns_used);
259
-
260
- const pos_end = utf8.findPosByWidth(text, 2, 4, false, true, .wcwidth);
261
- try testing.expectEqual(@as(u32, 3), pos_end.byte_offset);
262
- try testing.expectEqual(@as(u32, 2), pos_end.columns_used);
263
-
264
- const pos_3 = utf8.findPosByWidth(text, 3, 4, false, true, .wcwidth);
265
- try testing.expectEqual(@as(u32, 4), pos_3.byte_offset);
266
- try testing.expectEqual(@as(u32, 3), pos_3.columns_used);
267
- }
@@ -1,357 +0,0 @@
1
- const std = @import("std");
2
- const testing = std.testing;
3
- const utf8 = @import("../utf8.zig");
4
-
5
- test "findGraphemeInfo wcwidth: empty string" {
6
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
7
- defer result.deinit(testing.allocator);
8
-
9
- try utf8.findGraphemeInfo("", 4, false, .wcwidth, testing.allocator, &result);
10
- try testing.expectEqual(@as(usize, 0), result.items.len);
11
- }
12
-
13
- test "findGraphemeInfo wcwidth: ASCII-only returns empty" {
14
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
15
- defer result.deinit(testing.allocator);
16
-
17
- try utf8.findGraphemeInfo("hello world", 4, true, .wcwidth, testing.allocator, &result);
18
- try testing.expectEqual(@as(usize, 0), result.items.len);
19
- }
20
-
21
- test "findGraphemeInfo wcwidth: ASCII with tab" {
22
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
23
- defer result.deinit(testing.allocator);
24
-
25
- try utf8.findGraphemeInfo("hello\tworld", 4, false, .wcwidth, testing.allocator, &result);
26
-
27
- // Should have one entry for the tab
28
- try testing.expectEqual(@as(usize, 1), result.items.len);
29
- try testing.expectEqual(@as(u32, 5), result.items[0].byte_offset);
30
- try testing.expectEqual(@as(u8, 1), result.items[0].byte_len);
31
- try testing.expectEqual(@as(u8, 4), result.items[0].width);
32
- try testing.expectEqual(@as(u32, 5), result.items[0].col_offset);
33
- }
34
-
35
- test "findGraphemeInfo wcwidth: CJK characters" {
36
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
37
- defer result.deinit(testing.allocator);
38
-
39
- const text = "helloδΈ–η•Œ";
40
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
41
-
42
- // Should have two entries for the CJK characters (each codepoint separately)
43
- try testing.expectEqual(@as(usize, 2), result.items.len);
44
-
45
- // First CJK char 'δΈ–' at byte 5
46
- try testing.expectEqual(@as(u32, 5), result.items[0].byte_offset);
47
- try testing.expectEqual(@as(u8, 3), result.items[0].byte_len);
48
- try testing.expectEqual(@as(u8, 2), result.items[0].width);
49
- try testing.expectEqual(@as(u32, 5), result.items[0].col_offset);
50
-
51
- // Second CJK char 'η•Œ' at byte 8
52
- try testing.expectEqual(@as(u32, 8), result.items[1].byte_offset);
53
- try testing.expectEqual(@as(u8, 3), result.items[1].byte_len);
54
- try testing.expectEqual(@as(u8, 2), result.items[1].width);
55
- try testing.expectEqual(@as(u32, 7), result.items[1].col_offset);
56
- }
57
-
58
- test "findGraphemeInfo wcwidth: emoji with skin tone - single grapheme cluster" {
59
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
60
- defer result.deinit(testing.allocator);
61
-
62
- const text = "πŸ‘‹πŸΏ"; // Wave + skin tone modifier
63
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
64
-
65
- try testing.expectEqual(@as(usize, 1), result.items.len);
66
-
67
- try testing.expectEqual(@as(u32, 0), result.items[0].byte_offset);
68
- try testing.expectEqual(@as(u8, 8), result.items[0].byte_len);
69
- try testing.expectEqual(@as(u8, 4), result.items[0].width);
70
- }
71
-
72
- test "findGraphemeInfo wcwidth: emoji with ZWJ - single grapheme cluster" {
73
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
74
- defer result.deinit(testing.allocator);
75
-
76
- const text = "πŸ‘©β€πŸš€"; // Woman + ZWJ + Rocket (11 bytes total)
77
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
78
-
79
- try testing.expectEqual(@as(usize, 1), result.items.len);
80
-
81
- try testing.expectEqual(@as(u8, 11), result.items[0].byte_len);
82
- try testing.expectEqual(@as(u8, 4), result.items[0].width);
83
- }
84
-
85
- test "findGraphemeInfo wcwidth: combining mark - part of base grapheme" {
86
- var result: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
87
- defer result.deinit(testing.allocator);
88
-
89
- const text = "e\u{0301}test"; // e + combining acute accent + test
90
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result);
91
-
92
- try testing.expectEqual(@as(usize, 1), result.items.len);
93
- try testing.expectEqual(@as(u32, 0), result.items[0].byte_offset);
94
- try testing.expectEqual(@as(u8, 3), result.items[0].byte_len);
95
- try testing.expectEqual(@as(u8, 1), result.items[0].width);
96
- }
97
-
98
- test "findGraphemeInfo wcwidth vs unicode: emoji with skin tone" {
99
- var result_wcwidth: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
100
- defer result_wcwidth.deinit(testing.allocator);
101
- var result_unicode: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
102
- defer result_unicode.deinit(testing.allocator);
103
-
104
- const text = "HiπŸ‘‹πŸΏBye";
105
-
106
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result_wcwidth);
107
- try utf8.findGraphemeInfo(text, 4, false, .unicode, testing.allocator, &result_unicode);
108
-
109
- try testing.expectEqual(@as(usize, 1), result_wcwidth.items.len);
110
- try testing.expectEqual(@as(usize, 1), result_unicode.items.len);
111
-
112
- try testing.expectEqual(@as(u32, 2), result_wcwidth.items[0].byte_offset);
113
- try testing.expectEqual(@as(u8, 8), result_wcwidth.items[0].byte_len);
114
-
115
- try testing.expectEqual(@as(u32, 2), result_unicode.items[0].byte_offset);
116
- try testing.expectEqual(@as(u8, 8), result_unicode.items[0].byte_len);
117
-
118
- try testing.expectEqual(@as(u8, 4), result_wcwidth.items[0].width);
119
- try testing.expectEqual(@as(u8, 2), result_unicode.items[0].width);
120
- }
121
-
122
- test "findGraphemeInfo wcwidth vs unicode: flag emoji" {
123
- var result_wcwidth: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
124
- defer result_wcwidth.deinit(testing.allocator);
125
- var result_unicode: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
126
- defer result_unicode.deinit(testing.allocator);
127
-
128
- const text = "πŸ‡ΊπŸ‡Έ"; // US flag (two regional indicators)
129
-
130
- try utf8.findGraphemeInfo(text, 4, false, .wcwidth, testing.allocator, &result_wcwidth);
131
- try utf8.findGraphemeInfo(text, 4, false, .unicode, testing.allocator, &result_unicode);
132
-
133
- try testing.expectEqual(@as(usize, 1), result_wcwidth.items.len);
134
- try testing.expectEqual(@as(usize, 1), result_unicode.items.len);
135
-
136
- try testing.expectEqual(@as(u8, 2), result_wcwidth.items[0].width);
137
- try testing.expectEqual(@as(u8, 2), result_unicode.items[0].width);
138
- }
139
-
140
- // ============================================================================
141
- // WIDTH CALCULATION TESTS - WCWIDTH MODE
142
- // ============================================================================
143
-
144
- test "getWidthAt wcwidth: combining mark has zero width" {
145
- const text = "e\u{0301}"; // e + combining acute accent
146
-
147
- // In wcwidth mode, combining mark is a separate codepoint
148
- const width_e = utf8.getWidthAt(text, 0, 8, .wcwidth);
149
- try testing.expectEqual(@as(u32, 1), width_e); // Just 'e'
150
-
151
- const width_combining = utf8.getWidthAt(text, 1, 8, .wcwidth);
152
- try testing.expectEqual(@as(u32, 0), width_combining); // Combining mark has width 0
153
- }
154
-
155
- test "calculateTextWidth wcwidth: emoji with skin tone counts both codepoints" {
156
- const text = "πŸ‘‹πŸΏ"; // Wave + dark skin tone
157
-
158
- const width_wcwidth = utf8.calculateTextWidth(text, 4, false, .wcwidth);
159
- const width_unicode = utf8.calculateTextWidth(text, 4, false, .unicode);
160
-
161
- // wcwidth: counts both codepoints (2 + 2 = 4)
162
- try testing.expectEqual(@as(u32, 4), width_wcwidth);
163
-
164
- // unicode: single grapheme cluster (width 2)
165
- try testing.expectEqual(@as(u32, 2), width_unicode);
166
- }
167
-
168
- test "calculateTextWidth wcwidth: flag emoji counts both RIs" {
169
- const text = "πŸ‡ΊπŸ‡Έ"; // US flag
170
-
171
- const width_wcwidth = utf8.calculateTextWidth(text, 4, false, .wcwidth);
172
- const width_unicode = utf8.calculateTextWidth(text, 4, false, .unicode);
173
-
174
- // wcwidth: counts both regional indicators (1 + 1 = 2)
175
- try testing.expectEqual(@as(u32, 2), width_wcwidth);
176
-
177
- // unicode: single flag grapheme (width 2)
178
- try testing.expectEqual(@as(u32, 2), width_unicode);
179
- }
180
-
181
- // ============================================================================
182
- // FIND WRAP POS BY WIDTH TESTS - WCWIDTH MODE
183
- // ============================================================================
184
-
185
- test "findWrapPosByWidth wcwidth: emoji with skin tone stops earlier" {
186
- const text = "HiπŸ‘‹πŸΏBye"; // H(1) i(1) wave(2) skin(2) B(1) y(1) e(1) = 10 cols wcwidth
187
-
188
- const result_wcwidth = utf8.findWrapPosByWidth(text, 4, 4, false, .wcwidth);
189
- const result_unicode = utf8.findWrapPosByWidth(text, 4, 4, false, .unicode);
190
-
191
- // wcwidth: stops after "HiπŸ‘‹" = 4 columns (1+1+2)
192
- try testing.expectEqual(@as(u32, 6), result_wcwidth.byte_offset);
193
- try testing.expectEqual(@as(u32, 4), result_wcwidth.columns_used);
194
-
195
- // unicode: stops after "HiπŸ‘‹πŸΏ" = 4 columns (1+1+2 for whole grapheme)
196
- try testing.expectEqual(@as(u32, 10), result_unicode.byte_offset);
197
- try testing.expectEqual(@as(u32, 4), result_unicode.columns_used);
198
- }
199
-
200
- test "findPosByWidth wcwidth: emoji boundary behavior" {
201
- const text = "ABπŸ‘‹πŸΏCD"; // A(1) B(1) wave(2) skin(2) C(1) D(1)
202
-
203
- // With include_start_before=false (selection start)
204
- const start3 = utf8.findPosByWidth(text, 3, 4, false, false, .wcwidth);
205
- // wcwidth: stops after "AB" at 2 columns (wave would exceed)
206
- try testing.expectEqual(@as(u32, 2), start3.byte_offset);
207
-
208
- // With include_start_before=true (selection end)
209
- const end3 = utf8.findPosByWidth(text, 3, 4, false, true, .wcwidth);
210
- // wcwidth: includes wave since it starts at column 2 which is < 3
211
- try testing.expectEqual(@as(u32, 6), end3.byte_offset);
212
- try testing.expectEqual(@as(u32, 4), end3.columns_used);
213
- }
214
-
215
- test "getPrevGraphemeStart wcwidth: each codepoint separate" {
216
- const text = "HiπŸ‘‹πŸΏ";
217
-
218
- // From end of text (after skin tone)
219
- const r_end = utf8.getPrevGraphemeStart(text, text.len, 4, .wcwidth);
220
- try testing.expect(r_end != null);
221
- try testing.expectEqual(@as(usize, 6), r_end.?.start_offset); // Skin tone starts at byte 6
222
- try testing.expectEqual(@as(u32, 2), r_end.?.width);
223
-
224
- // From start of skin tone (byte 6)
225
- const r_wave = utf8.getPrevGraphemeStart(text, 6, 4, .wcwidth);
226
- try testing.expect(r_wave != null);
227
- try testing.expectEqual(@as(usize, 2), r_wave.?.start_offset); // Wave starts at byte 2
228
- try testing.expectEqual(@as(u32, 2), r_wave.?.width);
229
- }
230
-
231
- // ============================================================================
232
- // ADDITIONAL COMPREHENSIVE WCWIDTH TESTS
233
- // ============================================================================
234
-
235
- test "wcwidth: zero-width characters are handled correctly" {
236
- // ZWJ (Zero Width Joiner) should have width 0
237
- const text_zwj = "\u{200D}";
238
- const width_zwj = utf8.calculateTextWidth(text_zwj, 4, false, .wcwidth);
239
- try testing.expectEqual(@as(u32, 0), width_zwj);
240
-
241
- // Combining marks should have width 0
242
- const text_combining = "e\u{0301}"; // e + combining acute
243
- const width = utf8.calculateTextWidth(text_combining, 4, false, .wcwidth);
244
- try testing.expectEqual(@as(u32, 1), width); // Only 'e' contributes
245
- }
246
-
247
- test "wcwidth: variation selectors" {
248
- // VS15 (text presentation) and VS16 (emoji presentation)
249
- const text_vs16 = "☺\u{FE0F}"; // Smiling face + VS16
250
- const width_vs16 = utf8.calculateTextWidth(text_vs16, 4, false, .wcwidth);
251
- try testing.expectEqual(@as(u32, 1), width_vs16); // Smiling face (1) + VS16 (0) = 1
252
- }
253
-
254
- test "wcwidth: regional indicators counted separately" {
255
- // Each regional indicator should contribute width 1
256
- const text = "πŸ‡ΊπŸ‡Έ"; // US flag = two regional indicators
257
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
258
- try testing.expectEqual(@as(u32, 2), width); // Each RI has width 1
259
- }
260
-
261
- test "wcwidth: emoji ZWJ sequences split" {
262
- // Woman astronaut = woman + ZWJ + rocket
263
- const text = "πŸ‘©β€πŸš€";
264
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
265
- // Woman (2) + ZWJ (0) + Rocket (2) = 4
266
- try testing.expectEqual(@as(u32, 4), width);
267
- }
268
-
269
- test "wcwidth: family emoji split into components" {
270
- // Family emoji with ZWJ
271
- const text = "πŸ‘¨β€πŸ‘©β€πŸ‘§"; // Man + ZWJ + Woman + ZWJ + Girl
272
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
273
- // Man (2) + ZWJ (0) + Woman (2) + ZWJ (0) + Girl (2) = 6
274
- try testing.expectEqual(@as(u32, 6), width);
275
- }
276
-
277
- test "wcwidth: skin tone modifiers counted separately" {
278
- // Emoji with skin tone modifier
279
- const text = "πŸ‘‹πŸ»"; // Wave + light skin tone
280
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
281
- // Wave (2) + Skin tone modifier (2) = 4
282
- try testing.expectEqual(@as(u32, 4), width);
283
- }
284
-
285
- test "wcwidth: CJK characters have width 2" {
286
- const text = "δ½ ε₯½δΈ–η•Œ"; // 4 CJK characters
287
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
288
- try testing.expectEqual(@as(u32, 8), width); // 4 * 2 = 8
289
- }
290
-
291
- test "wcwidth: mixed ASCII and emoji" {
292
- const text = "HelloπŸ‘‹World";
293
- // H(1) e(1) l(1) l(1) o(1) πŸ‘‹(2) W(1) o(1) r(1) l(1) d(1) = 12
294
- const width = utf8.calculateTextWidth(text, 4, false, .wcwidth);
295
- try testing.expectEqual(@as(u32, 12), width);
296
- }
297
-
298
- test "wcwidth: findWrapPosByWidth with ZWJ sequences" {
299
- const text = "ABπŸ‘©β€πŸš€CD"; // A(1) B(1) woman(2) ZWJ(0) rocket(2) C(1) D(1) = 8
300
-
301
- // Should wrap after woman emoji (before ZWJ)
302
- const result = utf8.findWrapPosByWidth(text, 4, 4, false, .wcwidth);
303
- try testing.expectEqual(@as(u32, 6), result.byte_offset); // After woman emoji
304
- try testing.expectEqual(@as(u32, 4), result.columns_used);
305
- }
306
-
307
- test "wcwidth: findPosByWidth with skin tone modifier" {
308
- const text = "ABπŸ‘‹πŸ»CD"; // A(1) B(1) wave(2) skin(2) C(1) D(1) = 8
309
-
310
- // With include_start_before=false, include codepoints that end at or before max_columns
311
- // Wave ends at column 4, which is at max_columns=4, so it's included
312
- const start4 = utf8.findPosByWidth(text, 4, 4, false, false, .wcwidth);
313
- try testing.expectEqual(@as(u32, 6), start4.byte_offset); // After wave
314
- try testing.expectEqual(@as(u32, 4), start4.columns_used);
315
-
316
- // With include_start_before=true, include codepoints that start before max_columns
317
- // Wave starts at column 2 which is < 4, so it's included
318
- const end4 = utf8.findPosByWidth(text, 4, 4, false, true, .wcwidth);
319
- try testing.expectEqual(@as(u32, 6), end4.byte_offset); // After wave
320
- try testing.expectEqual(@as(u32, 4), end4.columns_used);
321
- }
322
-
323
- test "wcwidth: getWidthAt with combining marks" {
324
- const text = "e\u{0301}test"; // e + combining acute
325
-
326
- // Width at 'e' should be 1
327
- const width_e = utf8.getWidthAt(text, 0, 4, .wcwidth);
328
- try testing.expectEqual(@as(u32, 1), width_e);
329
-
330
- // Width at combining mark should be 0 (but next non-zero is 't')
331
- const width_combining = utf8.getWidthAt(text, 1, 4, .wcwidth);
332
- try testing.expectEqual(@as(u32, 0), width_combining);
333
- }
334
-
335
- test "wcwidth: getPrevGraphemeStart with ZWJ sequence" {
336
- const text = "ABπŸ‘©β€πŸš€"; // A B woman ZWJ rocket
337
-
338
- // From end (after rocket)
339
- const r1 = utf8.getPrevGraphemeStart(text, text.len, 4, .wcwidth);
340
- try testing.expect(r1 != null);
341
- // Should point to rocket emoji (after ZWJ)
342
- try testing.expectEqual(@as(u32, 2), r1.?.width);
343
-
344
- // From rocket start, should go to ZWJ
345
- const r2 = utf8.getPrevGraphemeStart(text, r1.?.start_offset, 4, .wcwidth);
346
- try testing.expect(r2 != null);
347
-
348
- // Eventually should reach woman emoji
349
- var pos = text.len;
350
- var count: usize = 0;
351
- while (utf8.getPrevGraphemeStart(text, pos, 4, .wcwidth)) |prev| {
352
- pos = prev.start_offset;
353
- count += 1;
354
- if (count > 10) break; // Safety limit
355
- }
356
- try testing.expect(count >= 3); // At least rocket, ZWJ, woman
357
- }