@fairyhunter13/opentui-core 0.1.113 → 0.1.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/dev/keypress-debug-renderer.ts +148 -0
  2. package/dev/keypress-debug.ts +43 -0
  3. package/dev/print-env-vars.ts +32 -0
  4. package/dev/test-tmux-graphics-334.sh +68 -0
  5. package/dev/thai-debug-test.ts +68 -0
  6. package/docs/development.md +144 -0
  7. package/package.json +62 -53
  8. package/scripts/build.ts +400 -0
  9. package/scripts/publish.ts +60 -0
  10. package/src/3d/SpriteResourceManager.ts +286 -0
  11. package/src/3d/SpriteUtils.ts +70 -0
  12. package/src/3d/TextureUtils.ts +196 -0
  13. package/src/3d/ThreeRenderable.ts +197 -0
  14. package/src/3d/WGPURenderer.ts +294 -0
  15. package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
  16. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
  17. package/src/3d/animation/SpriteAnimator.ts +633 -0
  18. package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
  19. package/src/3d/canvas.ts +464 -0
  20. package/src/3d/index.ts +12 -0
  21. package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
  22. package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
  23. package/src/3d/physics/physics-interface.ts +31 -0
  24. package/src/3d/shaders/supersampling.wgsl +201 -0
  25. package/src/3d.ts +3 -0
  26. package/src/NativeSpanFeed.ts +300 -0
  27. package/src/Renderable.ts +1704 -0
  28. package/src/__snapshots__/buffer.test.ts.snap +28 -0
  29. package/src/animation/Timeline.test.ts +2709 -0
  30. package/src/animation/Timeline.ts +598 -0
  31. package/src/ansi.ts +18 -0
  32. package/src/benchmark/attenuation-benchmark.ts +81 -0
  33. package/src/benchmark/colormatrix-benchmark.ts +128 -0
  34. package/src/benchmark/gain-benchmark.ts +80 -0
  35. package/src/benchmark/latest-all-bench-run.json +707 -0
  36. package/src/benchmark/latest-async-bench-run.json +336 -0
  37. package/src/benchmark/latest-default-bench-run.json +657 -0
  38. package/src/benchmark/latest-large-bench-run.json +707 -0
  39. package/src/benchmark/latest-quick-bench-run.json +207 -0
  40. package/src/benchmark/markdown-benchmark.ts +1796 -0
  41. package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
  42. package/src/benchmark/native-span-feed-benchmark.md +56 -0
  43. package/src/benchmark/native-span-feed-benchmark.ts +596 -0
  44. package/src/benchmark/native-span-feed-compare.ts +280 -0
  45. package/src/benchmark/renderer-benchmark.ts +754 -0
  46. package/src/benchmark/text-table-benchmark.ts +948 -0
  47. package/src/buffer.test.ts +291 -0
  48. package/src/buffer.ts +554 -0
  49. package/src/console.test.ts +612 -0
  50. package/src/console.ts +1254 -0
  51. package/src/edit-buffer.test.ts +1769 -0
  52. package/src/edit-buffer.ts +411 -0
  53. package/src/editor-view.test.ts +1032 -0
  54. package/src/editor-view.ts +284 -0
  55. package/src/examples/ascii-font-selection-demo.ts +245 -0
  56. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  57. package/src/examples/assets/concrete.png +0 -0
  58. package/src/examples/assets/crate.png +0 -0
  59. package/src/examples/assets/crate_emissive.png +0 -0
  60. package/src/examples/assets/forrest_background.png +0 -0
  61. package/src/examples/assets/hast-example.json +1018 -0
  62. package/src/examples/assets/heart.png +0 -0
  63. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  64. package/src/examples/assets/main_char_idle.png +0 -0
  65. package/src/examples/assets/main_char_jump_end.png +0 -0
  66. package/src/examples/assets/main_char_jump_landing.png +0 -0
  67. package/src/examples/assets/main_char_jump_start.png +0 -0
  68. package/src/examples/assets/main_char_run_loop.png +0 -0
  69. package/src/examples/assets/roughness_map.jpg +0 -0
  70. package/src/examples/build.ts +115 -0
  71. package/src/examples/code-demo.ts +924 -0
  72. package/src/examples/console-demo.ts +358 -0
  73. package/src/examples/core-plugin-slots-demo.ts +759 -0
  74. package/src/examples/diff-demo.ts +701 -0
  75. package/src/examples/draggable-three-demo.ts +259 -0
  76. package/src/examples/editor-demo.ts +322 -0
  77. package/src/examples/extmarks-demo.ts +196 -0
  78. package/src/examples/focus-restore-demo.ts +310 -0
  79. package/src/examples/fonts.ts +245 -0
  80. package/src/examples/fractal-shader-demo.ts +268 -0
  81. package/src/examples/framebuffer-demo.ts +674 -0
  82. package/src/examples/full-unicode-demo.ts +241 -0
  83. package/src/examples/golden-star-demo.ts +933 -0
  84. package/src/examples/grayscale-buffer-demo.ts +249 -0
  85. package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
  86. package/src/examples/index.ts +926 -0
  87. package/src/examples/input-demo.ts +377 -0
  88. package/src/examples/input-select-layout-demo.ts +425 -0
  89. package/src/examples/install.sh +143 -0
  90. package/src/examples/keypress-debug-demo.ts +452 -0
  91. package/src/examples/lib/HexList.ts +122 -0
  92. package/src/examples/lib/PaletteGrid.ts +125 -0
  93. package/src/examples/lib/standalone-keys.ts +25 -0
  94. package/src/examples/lib/tab-controller.ts +243 -0
  95. package/src/examples/lights-phong-demo.ts +290 -0
  96. package/src/examples/link-demo.ts +220 -0
  97. package/src/examples/live-state-demo.ts +480 -0
  98. package/src/examples/markdown-demo.ts +725 -0
  99. package/src/examples/mouse-interaction-demo.ts +428 -0
  100. package/src/examples/nested-zindex-demo.ts +357 -0
  101. package/src/examples/opacity-example.ts +235 -0
  102. package/src/examples/opentui-demo.ts +1057 -0
  103. package/src/examples/physx-planck-2d-demo.ts +623 -0
  104. package/src/examples/physx-rapier-2d-demo.ts +655 -0
  105. package/src/examples/relative-positioning-demo.ts +323 -0
  106. package/src/examples/scroll-example.ts +214 -0
  107. package/src/examples/scrollbox-mouse-test.ts +112 -0
  108. package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
  109. package/src/examples/select-demo.ts +237 -0
  110. package/src/examples/shader-cube-demo.ts +1015 -0
  111. package/src/examples/simple-layout-example.ts +591 -0
  112. package/src/examples/slider-demo.ts +617 -0
  113. package/src/examples/split-mode-demo.ts +453 -0
  114. package/src/examples/sprite-animation-demo.ts +443 -0
  115. package/src/examples/sprite-particle-generator-demo.ts +486 -0
  116. package/src/examples/static-sprite-demo.ts +193 -0
  117. package/src/examples/sticky-scroll-example.ts +308 -0
  118. package/src/examples/styled-text-demo.ts +282 -0
  119. package/src/examples/tab-select-demo.ts +219 -0
  120. package/src/examples/terminal-title.ts +29 -0
  121. package/src/examples/terminal.ts +305 -0
  122. package/src/examples/text-node-demo.ts +416 -0
  123. package/src/examples/text-selection-demo.ts +377 -0
  124. package/src/examples/text-table-demo.ts +503 -0
  125. package/src/examples/text-truncation-demo.ts +481 -0
  126. package/src/examples/text-wrap.ts +757 -0
  127. package/src/examples/texture-loading-demo.ts +259 -0
  128. package/src/examples/timeline-example.ts +670 -0
  129. package/src/examples/transparency-demo.ts +400 -0
  130. package/src/examples/vnode-composition-demo.ts +404 -0
  131. package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
  132. package/src/index.ts +24 -0
  133. package/src/lib/KeyHandler.integration.test.ts +292 -0
  134. package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
  135. package/src/lib/KeyHandler.test.ts +662 -0
  136. package/src/lib/KeyHandler.ts +222 -0
  137. package/src/lib/RGBA.test.ts +984 -0
  138. package/src/lib/RGBA.ts +204 -0
  139. package/src/lib/ascii.font.ts +330 -0
  140. package/src/lib/border.test.ts +83 -0
  141. package/src/lib/border.ts +170 -0
  142. package/src/lib/bunfs.test.ts +27 -0
  143. package/src/lib/bunfs.ts +18 -0
  144. package/src/lib/clipboard.test.ts +41 -0
  145. package/src/lib/clipboard.ts +47 -0
  146. package/src/lib/clock.ts +35 -0
  147. package/src/lib/data-paths.test.ts +133 -0
  148. package/src/lib/data-paths.ts +109 -0
  149. package/src/lib/debounce.ts +106 -0
  150. package/src/lib/detect-links.test.ts +98 -0
  151. package/src/lib/detect-links.ts +56 -0
  152. package/src/lib/env.test.ts +228 -0
  153. package/src/lib/env.ts +209 -0
  154. package/src/lib/extmarks-history.ts +51 -0
  155. package/src/lib/extmarks-multiwidth.test.ts +322 -0
  156. package/src/lib/extmarks.test.ts +3457 -0
  157. package/src/lib/extmarks.ts +843 -0
  158. package/src/lib/fonts/block.json +405 -0
  159. package/src/lib/fonts/grid.json +265 -0
  160. package/src/lib/fonts/huge.json +741 -0
  161. package/src/lib/fonts/pallet.json +314 -0
  162. package/src/lib/fonts/shade.json +591 -0
  163. package/src/lib/fonts/slick.json +321 -0
  164. package/src/lib/fonts/tiny.json +69 -0
  165. package/src/lib/hast-styled-text.ts +59 -0
  166. package/src/lib/index.ts +21 -0
  167. package/src/lib/keymapping.test.ts +317 -0
  168. package/src/lib/keymapping.ts +115 -0
  169. package/src/lib/objects-in-viewport.test.ts +787 -0
  170. package/src/lib/objects-in-viewport.ts +153 -0
  171. package/src/lib/output.capture.ts +58 -0
  172. package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
  173. package/src/lib/parse.keypress-kitty.test.ts +663 -0
  174. package/src/lib/parse.keypress-kitty.ts +439 -0
  175. package/src/lib/parse.keypress.test.ts +1849 -0
  176. package/src/lib/parse.keypress.ts +397 -0
  177. package/src/lib/parse.mouse.test.ts +552 -0
  178. package/src/lib/parse.mouse.ts +232 -0
  179. package/src/lib/paste.ts +16 -0
  180. package/src/lib/queue.ts +65 -0
  181. package/src/lib/renderable.validations.test.ts +87 -0
  182. package/src/lib/renderable.validations.ts +83 -0
  183. package/src/lib/scroll-acceleration.ts +98 -0
  184. package/src/lib/selection.ts +240 -0
  185. package/src/lib/singleton.ts +28 -0
  186. package/src/lib/stdin-parser.test.ts +2290 -0
  187. package/src/lib/stdin-parser.ts +1810 -0
  188. package/src/lib/styled-text.ts +178 -0
  189. package/src/lib/terminal-capability-detection.test.ts +202 -0
  190. package/src/lib/terminal-capability-detection.ts +79 -0
  191. package/src/lib/terminal-palette.test.ts +878 -0
  192. package/src/lib/terminal-palette.ts +383 -0
  193. package/src/lib/tree-sitter/assets/README.md +118 -0
  194. package/src/lib/tree-sitter/assets/update.ts +334 -0
  195. package/src/lib/tree-sitter/assets.d.ts +9 -0
  196. package/src/lib/tree-sitter/cache.test.ts +273 -0
  197. package/src/lib/tree-sitter/client.test.ts +1165 -0
  198. package/src/lib/tree-sitter/client.ts +607 -0
  199. package/src/lib/tree-sitter/default-parsers.ts +86 -0
  200. package/src/lib/tree-sitter/download-utils.ts +148 -0
  201. package/src/lib/tree-sitter/index.ts +28 -0
  202. package/src/lib/tree-sitter/parser.worker.ts +1042 -0
  203. package/src/lib/tree-sitter/parsers-config.ts +81 -0
  204. package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
  205. package/src/lib/tree-sitter/resolve-ft.ts +189 -0
  206. package/src/lib/tree-sitter/types.ts +82 -0
  207. package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
  208. package/src/lib/tree-sitter-styled-text.ts +306 -0
  209. package/src/lib/validate-dir-name.ts +55 -0
  210. package/src/lib/yoga.options.test.ts +628 -0
  211. package/src/lib/yoga.options.ts +346 -0
  212. package/src/plugins/core-slot.ts +579 -0
  213. package/src/plugins/registry.ts +402 -0
  214. package/src/plugins/types.ts +46 -0
  215. package/src/post/effects.ts +930 -0
  216. package/src/post/filters.ts +489 -0
  217. package/src/post/matrices.ts +288 -0
  218. package/src/renderables/ASCIIFont.ts +219 -0
  219. package/src/renderables/Box.test.ts +205 -0
  220. package/src/renderables/Box.ts +326 -0
  221. package/src/renderables/Code.test.ts +2062 -0
  222. package/src/renderables/Code.ts +357 -0
  223. package/src/renderables/Diff.regression.test.ts +226 -0
  224. package/src/renderables/Diff.test.ts +3101 -0
  225. package/src/renderables/Diff.ts +1211 -0
  226. package/src/renderables/EditBufferRenderable.test.ts +288 -0
  227. package/src/renderables/EditBufferRenderable.ts +1166 -0
  228. package/src/renderables/FrameBuffer.ts +47 -0
  229. package/src/renderables/Input.test.ts +1228 -0
  230. package/src/renderables/Input.ts +247 -0
  231. package/src/renderables/LineNumberRenderable.ts +724 -0
  232. package/src/renderables/Markdown.ts +1393 -0
  233. package/src/renderables/ScrollBar.ts +422 -0
  234. package/src/renderables/ScrollBox.ts +883 -0
  235. package/src/renderables/Select.test.ts +1033 -0
  236. package/src/renderables/Select.ts +524 -0
  237. package/src/renderables/Slider.test.ts +456 -0
  238. package/src/renderables/Slider.ts +342 -0
  239. package/src/renderables/TabSelect.test.ts +197 -0
  240. package/src/renderables/TabSelect.ts +455 -0
  241. package/src/renderables/Text.selection-buffer.test.ts +123 -0
  242. package/src/renderables/Text.test.ts +2660 -0
  243. package/src/renderables/Text.ts +147 -0
  244. package/src/renderables/TextBufferRenderable.ts +518 -0
  245. package/src/renderables/TextNode.test.ts +1058 -0
  246. package/src/renderables/TextNode.ts +325 -0
  247. package/src/renderables/TextTable.test.ts +1421 -0
  248. package/src/renderables/TextTable.ts +1344 -0
  249. package/src/renderables/Textarea.ts +430 -0
  250. package/src/renderables/TimeToFirstDraw.ts +89 -0
  251. package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
  252. package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
  253. package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
  254. package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
  255. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
  256. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
  257. package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
  258. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
  259. package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
  260. package/src/renderables/__tests__/Markdown.test.ts +2518 -0
  261. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
  262. package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
  263. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
  264. package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
  265. package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
  266. package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
  267. package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
  268. package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
  269. package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
  270. package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
  271. package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
  272. package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
  273. package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
  274. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
  275. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
  276. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
  277. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
  278. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
  279. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
  280. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
  281. package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
  282. package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
  283. package/src/renderables/composition/README.md +8 -0
  284. package/src/renderables/composition/VRenderable.ts +32 -0
  285. package/src/renderables/composition/constructs.ts +127 -0
  286. package/src/renderables/composition/vnode.ts +289 -0
  287. package/src/renderables/index.ts +23 -0
  288. package/src/renderables/markdown-parser.ts +66 -0
  289. package/src/renderer.ts +2681 -0
  290. package/src/runtime-plugin-support.ts +39 -0
  291. package/src/runtime-plugin.ts +615 -0
  292. package/src/syntax-style.test.ts +841 -0
  293. package/src/syntax-style.ts +257 -0
  294. package/src/testing/README.md +210 -0
  295. package/src/testing/capture-spans.test.ts +194 -0
  296. package/src/testing/integration.test.ts +276 -0
  297. package/src/testing/manual-clock.ts +117 -0
  298. package/src/testing/mock-keys.test.ts +1378 -0
  299. package/src/testing/mock-keys.ts +457 -0
  300. package/src/testing/mock-mouse.test.ts +218 -0
  301. package/src/testing/mock-mouse.ts +247 -0
  302. package/src/testing/mock-tree-sitter-client.ts +73 -0
  303. package/src/testing/spy.ts +13 -0
  304. package/src/testing/test-recorder.test.ts +415 -0
  305. package/src/testing/test-recorder.ts +145 -0
  306. package/src/testing/test-renderer.ts +132 -0
  307. package/src/testing.ts +7 -0
  308. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
  309. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
  310. package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
  311. package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
  312. package/src/tests/allocator-stats.test.ts +38 -0
  313. package/src/tests/destroy-during-render.test.ts +200 -0
  314. package/src/tests/destroy-on-exit.fixture.ts +36 -0
  315. package/src/tests/destroy-on-exit.test.ts +41 -0
  316. package/src/tests/hover-cursor.test.ts +98 -0
  317. package/src/tests/native-span-feed-async.test.ts +173 -0
  318. package/src/tests/native-span-feed-close.test.ts +120 -0
  319. package/src/tests/native-span-feed-coverage.test.ts +227 -0
  320. package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
  321. package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
  322. package/src/tests/opacity.test.ts +123 -0
  323. package/src/tests/renderable.snapshot.test.ts +524 -0
  324. package/src/tests/renderable.test.ts +1281 -0
  325. package/src/tests/renderer.clock.test.ts +158 -0
  326. package/src/tests/renderer.console-startup.test.ts +185 -0
  327. package/src/tests/renderer.control.test.ts +425 -0
  328. package/src/tests/renderer.core-slot-binding.test.ts +952 -0
  329. package/src/tests/renderer.cursor.test.ts +26 -0
  330. package/src/tests/renderer.destroy-during-render.test.ts +147 -0
  331. package/src/tests/renderer.focus-restore.test.ts +257 -0
  332. package/src/tests/renderer.focus.test.ts +294 -0
  333. package/src/tests/renderer.idle.test.ts +219 -0
  334. package/src/tests/renderer.input.test.ts +2237 -0
  335. package/src/tests/renderer.kitty-flags.test.ts +195 -0
  336. package/src/tests/renderer.mouse.test.ts +1274 -0
  337. package/src/tests/renderer.palette.test.ts +629 -0
  338. package/src/tests/renderer.selection.test.ts +49 -0
  339. package/src/tests/renderer.slot-registry.test.ts +684 -0
  340. package/src/tests/renderer.useMouse.test.ts +47 -0
  341. package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
  342. package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
  343. package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
  344. package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
  345. package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
  346. package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
  347. package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
  348. package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
  349. package/src/tests/runtime-plugin-support.fixture.ts +11 -0
  350. package/src/tests/runtime-plugin-support.test.ts +19 -0
  351. package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
  352. package/src/tests/runtime-plugin.fixture.ts +40 -0
  353. package/src/tests/runtime-plugin.test.ts +354 -0
  354. package/src/tests/scrollbox-culling-bug.test.ts +114 -0
  355. package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
  356. package/src/tests/scrollbox-hitgrid.test.ts +909 -0
  357. package/src/tests/scrollbox.test.ts +1530 -0
  358. package/src/tests/wrap-resize-perf.test.ts +276 -0
  359. package/src/tests/yoga-setters.test.ts +921 -0
  360. package/src/text-buffer-view.test.ts +705 -0
  361. package/src/text-buffer-view.ts +189 -0
  362. package/src/text-buffer.test.ts +347 -0
  363. package/src/text-buffer.ts +250 -0
  364. package/src/types.ts +161 -0
  365. package/src/utils.ts +88 -0
  366. package/src/zig/ansi.zig +268 -0
  367. package/src/zig/bench/README.md +50 -0
  368. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
  369. package/src/zig/bench/edit-buffer_bench.zig +476 -0
  370. package/src/zig/bench/native-span-feed_bench.zig +100 -0
  371. package/src/zig/bench/rope-markers_bench.zig +713 -0
  372. package/src/zig/bench/rope_bench.zig +514 -0
  373. package/src/zig/bench/styled-text_bench.zig +470 -0
  374. package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
  375. package/src/zig/bench/text-buffer-view_bench.zig +459 -0
  376. package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
  377. package/src/zig/bench/utf8_bench.zig +799 -0
  378. package/src/zig/bench-utils.zig +431 -0
  379. package/src/zig/bench.zig +217 -0
  380. package/src/zig/buffer-methods.zig +211 -0
  381. package/src/zig/buffer.zig +2281 -0
  382. package/src/zig/build.zig +289 -0
  383. package/src/zig/build.zig.zon +16 -0
  384. package/src/zig/edit-buffer.zig +825 -0
  385. package/src/zig/editor-view.zig +802 -0
  386. package/src/zig/event-bus.zig +13 -0
  387. package/src/zig/event-emitter.zig +65 -0
  388. package/src/zig/file-logger.zig +92 -0
  389. package/src/zig/grapheme.zig +599 -0
  390. package/src/zig/lib.zig +1854 -0
  391. package/src/zig/link.zig +333 -0
  392. package/src/zig/logger.zig +43 -0
  393. package/src/zig/mem-registry.zig +125 -0
  394. package/src/zig/native-span-feed-bench-lib.zig +7 -0
  395. package/src/zig/native-span-feed.zig +708 -0
  396. package/src/zig/renderer.zig +1393 -0
  397. package/src/zig/rope.zig +1220 -0
  398. package/src/zig/syntax-style.zig +161 -0
  399. package/src/zig/terminal.zig +987 -0
  400. package/src/zig/test.zig +72 -0
  401. package/src/zig/tests/README.md +18 -0
  402. package/src/zig/tests/buffer-methods_test.zig +1109 -0
  403. package/src/zig/tests/buffer_test.zig +2557 -0
  404. package/src/zig/tests/edit-buffer-history_test.zig +271 -0
  405. package/src/zig/tests/edit-buffer_test.zig +1689 -0
  406. package/src/zig/tests/editor-view_test.zig +3299 -0
  407. package/src/zig/tests/event-emitter_test.zig +249 -0
  408. package/src/zig/tests/grapheme_test.zig +1304 -0
  409. package/src/zig/tests/link_test.zig +190 -0
  410. package/src/zig/tests/mem-registry_test.zig +473 -0
  411. package/src/zig/tests/memory_leak_regression_test.zig +159 -0
  412. package/src/zig/tests/native-span-feed_test.zig +1264 -0
  413. package/src/zig/tests/renderer_test.zig +1017 -0
  414. package/src/zig/tests/rope-nested_test.zig +712 -0
  415. package/src/zig/tests/rope_fuzz_test.zig +238 -0
  416. package/src/zig/tests/rope_test.zig +2362 -0
  417. package/src/zig/tests/segment-merge.test.zig +148 -0
  418. package/src/zig/tests/syntax-style_test.zig +557 -0
  419. package/src/zig/tests/terminal_test.zig +754 -0
  420. package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
  421. package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
  422. package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
  423. package/src/zig/tests/text-buffer-segment_test.zig +320 -0
  424. package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
  425. package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
  426. package/src/zig/tests/text-buffer-view_test.zig +3649 -0
  427. package/src/zig/tests/text-buffer_test.zig +2191 -0
  428. package/src/zig/tests/unicode-width-map.zon +3909 -0
  429. package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
  430. package/src/zig/tests/utf8_test.zig +4057 -0
  431. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
  432. package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
  433. package/src/zig/tests/word-wrap-editing_test.zig +498 -0
  434. package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
  435. package/src/zig/text-buffer-iterators.zig +499 -0
  436. package/src/zig/text-buffer-segment.zig +404 -0
  437. package/src/zig/text-buffer-view.zig +1371 -0
  438. package/src/zig/text-buffer.zig +1180 -0
  439. package/src/zig/utf8.zig +1948 -0
  440. package/src/zig/utils.zig +9 -0
  441. package/src/zig-structs.ts +261 -0
  442. package/src/zig.ts +3884 -0
  443. package/tsconfig.build.json +24 -0
  444. package/tsconfig.json +27 -0
  445. package/3d/SpriteResourceManager.d.ts +0 -74
  446. package/3d/SpriteUtils.d.ts +0 -13
  447. package/3d/TextureUtils.d.ts +0 -24
  448. package/3d/ThreeRenderable.d.ts +0 -40
  449. package/3d/WGPURenderer.d.ts +0 -61
  450. package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
  451. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
  452. package/3d/animation/SpriteAnimator.d.ts +0 -124
  453. package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
  454. package/3d/canvas.d.ts +0 -44
  455. package/3d/index.d.ts +0 -12
  456. package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
  457. package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
  458. package/3d/physics/physics-interface.d.ts +0 -27
  459. package/3d.d.ts +0 -2
  460. package/3d.js +0 -34041
  461. package/3d.js.map +0 -155
  462. package/LICENSE +0 -21
  463. package/NativeSpanFeed.d.ts +0 -41
  464. package/Renderable.d.ts +0 -334
  465. package/animation/Timeline.d.ts +0 -126
  466. package/ansi.d.ts +0 -13
  467. package/buffer.d.ts +0 -111
  468. package/console.d.ts +0 -144
  469. package/edit-buffer.d.ts +0 -98
  470. package/editor-view.d.ts +0 -73
  471. package/index-9vwc3fg6.js +0 -12260
  472. package/index-9vwc3fg6.js.map +0 -42
  473. package/index-dcj62y8t.js +0 -20614
  474. package/index-dcj62y8t.js.map +0 -67
  475. package/index-f7n39gpy.js +0 -411
  476. package/index-f7n39gpy.js.map +0 -10
  477. package/index.d.ts +0 -23
  478. package/index.js +0 -478
  479. package/index.js.map +0 -9
  480. package/lib/KeyHandler.d.ts +0 -61
  481. package/lib/RGBA.d.ts +0 -25
  482. package/lib/ascii.font.d.ts +0 -508
  483. package/lib/border.d.ts +0 -51
  484. package/lib/bunfs.d.ts +0 -7
  485. package/lib/clipboard.d.ts +0 -17
  486. package/lib/clock.d.ts +0 -15
  487. package/lib/data-paths.d.ts +0 -26
  488. package/lib/debounce.d.ts +0 -42
  489. package/lib/detect-links.d.ts +0 -6
  490. package/lib/env.d.ts +0 -42
  491. package/lib/extmarks-history.d.ts +0 -17
  492. package/lib/extmarks.d.ts +0 -89
  493. package/lib/hast-styled-text.d.ts +0 -17
  494. package/lib/index.d.ts +0 -21
  495. package/lib/keymapping.d.ts +0 -25
  496. package/lib/objects-in-viewport.d.ts +0 -24
  497. package/lib/output.capture.d.ts +0 -24
  498. package/lib/parse.keypress-kitty.d.ts +0 -2
  499. package/lib/parse.keypress.d.ts +0 -26
  500. package/lib/parse.mouse.d.ts +0 -30
  501. package/lib/paste.d.ts +0 -7
  502. package/lib/queue.d.ts +0 -15
  503. package/lib/renderable.validations.d.ts +0 -12
  504. package/lib/scroll-acceleration.d.ts +0 -43
  505. package/lib/selection.d.ts +0 -63
  506. package/lib/singleton.d.ts +0 -7
  507. package/lib/stdin-parser.d.ts +0 -87
  508. package/lib/styled-text.d.ts +0 -63
  509. package/lib/terminal-capability-detection.d.ts +0 -30
  510. package/lib/terminal-palette.d.ts +0 -50
  511. package/lib/tree-sitter/assets/update.d.ts +0 -11
  512. package/lib/tree-sitter/client.d.ts +0 -47
  513. package/lib/tree-sitter/default-parsers.d.ts +0 -2
  514. package/lib/tree-sitter/download-utils.d.ts +0 -21
  515. package/lib/tree-sitter/index.d.ts +0 -8
  516. package/lib/tree-sitter/parser.worker.d.ts +0 -1
  517. package/lib/tree-sitter/parsers-config.d.ts +0 -53
  518. package/lib/tree-sitter/resolve-ft.d.ts +0 -5
  519. package/lib/tree-sitter/types.d.ts +0 -82
  520. package/lib/tree-sitter-styled-text.d.ts +0 -14
  521. package/lib/validate-dir-name.d.ts +0 -1
  522. package/lib/yoga.options.d.ts +0 -32
  523. package/parser.worker.js +0 -899
  524. package/parser.worker.js.map +0 -12
  525. package/plugins/core-slot.d.ts +0 -72
  526. package/plugins/registry.d.ts +0 -42
  527. package/plugins/types.d.ts +0 -34
  528. package/post/effects.d.ts +0 -147
  529. package/post/filters.d.ts +0 -65
  530. package/post/matrices.d.ts +0 -20
  531. package/renderables/ASCIIFont.d.ts +0 -52
  532. package/renderables/Box.d.ts +0 -81
  533. package/renderables/Code.d.ts +0 -78
  534. package/renderables/Diff.d.ts +0 -142
  535. package/renderables/EditBufferRenderable.d.ts +0 -237
  536. package/renderables/FrameBuffer.d.ts +0 -16
  537. package/renderables/Input.d.ts +0 -67
  538. package/renderables/LineNumberRenderable.d.ts +0 -78
  539. package/renderables/Markdown.d.ts +0 -185
  540. package/renderables/ScrollBar.d.ts +0 -77
  541. package/renderables/ScrollBox.d.ts +0 -124
  542. package/renderables/Select.d.ts +0 -115
  543. package/renderables/Slider.d.ts +0 -47
  544. package/renderables/TabSelect.d.ts +0 -96
  545. package/renderables/Text.d.ts +0 -36
  546. package/renderables/TextBufferRenderable.d.ts +0 -105
  547. package/renderables/TextNode.d.ts +0 -91
  548. package/renderables/TextTable.d.ts +0 -140
  549. package/renderables/Textarea.d.ts +0 -63
  550. package/renderables/TimeToFirstDraw.d.ts +0 -24
  551. package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
  552. package/renderables/composition/VRenderable.d.ts +0 -16
  553. package/renderables/composition/constructs.d.ts +0 -35
  554. package/renderables/composition/vnode.d.ts +0 -46
  555. package/renderables/index.d.ts +0 -23
  556. package/renderables/markdown-parser.d.ts +0 -10
  557. package/renderer.d.ts +0 -419
  558. package/runtime-plugin-support.d.ts +0 -3
  559. package/runtime-plugin-support.js +0 -29
  560. package/runtime-plugin-support.js.map +0 -10
  561. package/runtime-plugin.d.ts +0 -16
  562. package/runtime-plugin.js +0 -16
  563. package/runtime-plugin.js.map +0 -9
  564. package/syntax-style.d.ts +0 -54
  565. package/testing/manual-clock.d.ts +0 -17
  566. package/testing/mock-keys.d.ts +0 -81
  567. package/testing/mock-mouse.d.ts +0 -38
  568. package/testing/mock-tree-sitter-client.d.ts +0 -23
  569. package/testing/spy.d.ts +0 -7
  570. package/testing/test-recorder.d.ts +0 -61
  571. package/testing/test-renderer.d.ts +0 -23
  572. package/testing.d.ts +0 -6
  573. package/testing.js +0 -697
  574. package/testing.js.map +0 -15
  575. package/text-buffer-view.d.ts +0 -42
  576. package/text-buffer.d.ts +0 -67
  577. package/types.d.ts +0 -139
  578. package/utils.d.ts +0 -14
  579. package/zig-structs.d.ts +0 -155
  580. package/zig.d.ts +0 -353
  581. /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
  582. /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
  583. /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
  584. /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
  585. /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
  586. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
  587. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  588. /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
  589. /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
  590. /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
  591. /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
@@ -0,0 +1,308 @@
1
+ import { BoxRenderable, type CliRenderer, createCliRenderer, TextRenderable, t, fg, bold } from "../index.js"
2
+ import { ScrollBoxRenderable } from "../renderables/ScrollBox.js"
3
+ import { setupCommonDemoKeys } from "./lib/standalone-keys.js"
4
+
5
+ let scrollBox: ScrollBoxRenderable | null = null
6
+ let renderer: CliRenderer | null = null
7
+ let mainContainer: BoxRenderable | null = null
8
+ let instructionsBox: BoxRenderable | null = null
9
+ let itemCount = 0
10
+ let animationInterval: ReturnType<typeof setInterval> | null = null
11
+
12
+ // Track items with their creation time for animation
13
+ interface AnimatedItem {
14
+ box: BoxRenderable
15
+ text: TextRenderable
16
+ createdAt: number
17
+ originalContent: string
18
+ normalBgColor: string
19
+ isAtTop: boolean
20
+ }
21
+
22
+ const animatedItems = new Map<string, AnimatedItem>()
23
+
24
+ // Clear all items from the scroll box
25
+ function clearAllItems() {
26
+ if (!scrollBox) return
27
+
28
+ // Stop any running animations
29
+ if (animationInterval) {
30
+ clearInterval(animationInterval)
31
+ animationInterval = null
32
+ }
33
+
34
+ // Clear animated items tracking
35
+ animatedItems.clear()
36
+
37
+ // Remove all children from scroll box
38
+ const children = scrollBox.getChildren()
39
+ for (const child of children) {
40
+ scrollBox.remove(child.id)
41
+ child.destroyRecursively()
42
+ }
43
+
44
+ // Reset item count
45
+ itemCount = 0
46
+ }
47
+
48
+ // Color interpolation helper
49
+ function interpolateColor(color1: string, color2: string, factor: number): string {
50
+ const c1 = parseInt(color1.slice(1), 16)
51
+ const c2 = parseInt(color2.slice(1), 16)
52
+
53
+ const r1 = (c1 >> 16) & 0xff
54
+ const g1 = (c1 >> 8) & 0xff
55
+ const b1 = c1 & 0xff
56
+
57
+ const r2 = (c2 >> 16) & 0xff
58
+ const g2 = (c2 >> 8) & 0xff
59
+ const b2 = c2 & 0xff
60
+
61
+ const r = Math.round(r1 + (r2 - r1) * factor)
62
+ const g = Math.round(g1 + (g2 - g1) * factor)
63
+ const b = Math.round(b1 + (b2 - b1) * factor)
64
+
65
+ return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`
66
+ }
67
+
68
+ // Animation update function
69
+ function updateAnimations() {
70
+ const now = Date.now()
71
+
72
+ for (const [id, item] of animatedItems) {
73
+ const age = now - item.createdAt
74
+ const duration = 800 // 800ms animation
75
+
76
+ if (age >= duration) {
77
+ // Animation complete, set to final colors
78
+ item.box.backgroundColor = item.normalBgColor
79
+
80
+ // Set final content with normal colors
81
+ const itemNumber = id.split("-")[1]
82
+ const timeString = new Date(item.createdAt).toLocaleTimeString()
83
+ const finalContent = t`${bold(fg("#7aa2f7")(`Item #${itemNumber}`))}
84
+ ${fg("#9aa5ce")("This is a dynamically added item with enhanced content.")}
85
+ ${fg("#c0caf5")("Contains additional information and styling.")}
86
+ ${fg("#565f89")("Added at:")} ${timeString}
87
+ ${fg("#565f89")("Position:")} ${item.isAtTop ? "TOP" : "BOTTOM"}
88
+ ${fg("#565f89")("Status:")} ${fg("#9ece6a")("ACTIVE")}`
89
+
90
+ item.text.content = finalContent
91
+ animatedItems.delete(id)
92
+ continue
93
+ }
94
+
95
+ const progress = age / duration
96
+ const easeProgress = 1 - Math.pow(1 - progress, 3) // Ease out cubic
97
+
98
+ // Interpolate background color (bright to normal)
99
+ const brightBg = "#4c4f69"
100
+ item.box.backgroundColor = interpolateColor(brightBg, item.normalBgColor, easeProgress)
101
+
102
+ // Update text with flashy purple fading to normal blue
103
+ const itemNumber = id.split("-")[1]
104
+ const currentTitleColor = interpolateColor("#bb9af7", "#7aa2f7", easeProgress)
105
+ const timeString = new Date(item.createdAt).toLocaleTimeString()
106
+
107
+ // Reconstruct content with interpolated color
108
+ const updatedContent = t`${bold(fg(currentTitleColor)(`Item #${itemNumber}`))}
109
+ ${fg("#9aa5ce")("This is a dynamically added item with enhanced content.")}
110
+ ${fg("#c0caf5")("Contains additional information and styling.")}
111
+ ${fg("#565f89")("Added at:")} ${timeString}
112
+ ${fg("#565f89")("Position:")} ${item.isAtTop ? "TOP" : "BOTTOM"}
113
+ ${fg("#565f89")("Status:")} ${fg("#9ece6a")("ACTIVE")}`
114
+
115
+ item.text.content = updatedContent
116
+ }
117
+
118
+ // Stop animation loop if no items are animating
119
+ if (animatedItems.size === 0 && animationInterval) {
120
+ clearInterval(animationInterval)
121
+ animationInterval = null
122
+ }
123
+ }
124
+
125
+ function addItem(atTop: boolean = false) {
126
+ if (!renderer || !scrollBox) return
127
+
128
+ itemCount++
129
+
130
+ const boxId = `item-${itemCount}`
131
+ const normalBgColor = itemCount % 2 === 0 ? "#24283b" : "#1f2335"
132
+
133
+ // Start with flashy colors
134
+ const box = new BoxRenderable(renderer, {
135
+ id: boxId,
136
+ width: "auto",
137
+ padding: 1,
138
+ marginBottom: 1,
139
+ backgroundColor: "#4c4f69", // Bright initial background
140
+ })
141
+
142
+ const timeString = new Date().toLocaleTimeString()
143
+
144
+ // Store original content as string (without template literal processing)
145
+ const originalContent = `Item #${itemCount}\nThis is a dynamically added item with enhanced content.\nContains additional information and styling.\nAdded at: ${timeString}\nPosition: ${atTop ? "TOP" : "BOTTOM"}\nStatus: ACTIVE`
146
+
147
+ // Start with flashy purple title using template literal
148
+ const flashyContent = t`${bold(fg("#bb9af7")(`Item #${itemCount}`))}
149
+ ${fg("#9aa5ce")("This is a dynamically added item with enhanced content.")}
150
+ ${fg("#c0caf5")("Contains additional information and styling.")}
151
+ ${fg("#565f89")("Added at:")} ${timeString}
152
+ ${fg("#565f89")("Position:")} ${atTop ? "TOP" : "BOTTOM"}
153
+ ${fg("#565f89")("Status:")} ${fg("#9ece6a")("ACTIVE")}`
154
+
155
+ const text = new TextRenderable(renderer, {
156
+ content: flashyContent,
157
+ })
158
+
159
+ box.add(text)
160
+
161
+ if (atTop) {
162
+ scrollBox.add(box, 0) // Add at the beginning
163
+ } else {
164
+ scrollBox.add(box) // Add at the end
165
+ }
166
+
167
+ // Track for animation
168
+ animatedItems.set(boxId, {
169
+ box,
170
+ text,
171
+ createdAt: Date.now(),
172
+ originalContent,
173
+ normalBgColor,
174
+ isAtTop: atTop,
175
+ })
176
+
177
+ // Start animation loop if not running
178
+ if (!animationInterval) {
179
+ animationInterval = setInterval(updateAnimations, 16) // ~60fps
180
+ }
181
+ }
182
+
183
+ export function run(rendererInstance: CliRenderer): void {
184
+ renderer = rendererInstance
185
+ renderer.setBackgroundColor("#0a0a14")
186
+
187
+ mainContainer = new BoxRenderable(renderer, {
188
+ id: "main-container",
189
+ flexGrow: 1,
190
+ maxHeight: "100%",
191
+ maxWidth: "100%",
192
+ flexDirection: "column",
193
+ backgroundColor: "#0f0f23",
194
+ })
195
+
196
+ scrollBox = new ScrollBoxRenderable(renderer, {
197
+ id: "sticky-scroll-box",
198
+ stickyScroll: true,
199
+ stickyStart: "bottom",
200
+ rootOptions: {
201
+ backgroundColor: "#1e1e2e",
202
+ border: true,
203
+ },
204
+ wrapperOptions: {
205
+ backgroundColor: "#181825",
206
+ },
207
+ viewportOptions: {
208
+ backgroundColor: "#11111b",
209
+ },
210
+ contentOptions: {
211
+ backgroundColor: "#0f0f0f",
212
+ },
213
+ scrollbarOptions: {
214
+ // width: 2,
215
+ // showArrows: true,
216
+ trackOptions: {
217
+ foregroundColor: "#7aa2f7",
218
+ backgroundColor: "#313244",
219
+ },
220
+ },
221
+ })
222
+
223
+ instructionsBox = new BoxRenderable(renderer, {
224
+ id: "instructions",
225
+ width: "100%",
226
+ flexDirection: "column",
227
+ backgroundColor: "#1e1e2e",
228
+ paddingLeft: 1,
229
+ flexShrink: 0,
230
+ })
231
+
232
+ const instructionsText1 = new TextRenderable(renderer, {
233
+ content: t`${bold(fg("#7aa2f7")("Sticky Scroll Demo"))} ${fg("#565f89")("-")} ${bold(fg("#9ece6a")("S"))} ${fg("#c0caf5")("Toggle sticky scroll")} ${fg("#565f89")("|")} ${bold(fg("#bb9af7")("T"))} ${fg("#c0caf5")("Add item at top")} ${fg("#565f89")("|")} ${bold(fg("#f7768e")("B"))} ${fg("#c0caf5")("Add item at bottom")} ${fg("#565f89")("|")} ${bold(fg("#e0af68")("E"))} ${fg("#c0caf5")("Clear all items")}`,
234
+ })
235
+
236
+ const instructionsText2 = new TextRenderable(renderer, {
237
+ content: t`${bold(fg("#7aa2f7")("Behavior:"))} ${fg("#c0caf5")("Scroll to top/bottom, then add items to see sticky behavior")}`,
238
+ })
239
+
240
+ const instructionsText3 = new TextRenderable(renderer, {
241
+ content: t`${bold(fg("#7aa2f7")("Status:"))} ${fg("#c0caf5")("Sticky Scroll:")} ${scrollBox.stickyScroll ? fg("#9ece6a")("ENABLED") : fg("#f7768e")("DISABLED")}`,
242
+ })
243
+
244
+ instructionsBox.add(instructionsText1)
245
+ instructionsBox.add(instructionsText2)
246
+ instructionsBox.add(instructionsText3)
247
+
248
+ mainContainer.add(scrollBox)
249
+ mainContainer.add(instructionsBox)
250
+
251
+ renderer.root.add(mainContainer)
252
+
253
+ scrollBox.focus()
254
+
255
+ // Add some initial items
256
+ for (let i = 0; i < 10; i++) {
257
+ addItem(false)
258
+ }
259
+
260
+ rendererInstance.keyInput.on("keypress", (key) => {
261
+ if (key.name === "s" && scrollBox) {
262
+ // Toggle sticky scroll
263
+ const currentSticky = scrollBox.stickyScroll
264
+ scrollBox.stickyScroll = !currentSticky
265
+ console.log(`Sticky scroll ${!currentSticky ? "enabled" : "disabled"}`)
266
+
267
+ // Update status display
268
+ if (instructionsBox && instructionsBox.getChildren().length >= 3) {
269
+ const statusText = instructionsBox.getChildren()[2] as TextRenderable
270
+ statusText.content = t`${bold(fg("#7aa2f7")("Status:"))} ${fg("#c0caf5")("Sticky Scroll:")} ${(scrollBox as any).stickyScroll ? fg("#9ece6a")("ENABLED") : fg("#f7768e")("DISABLED")}`
271
+ }
272
+ } else if (key.name === "t" && scrollBox) {
273
+ addItem(true) // Add at top
274
+ console.log("Added item at top")
275
+ } else if (key.name === "b" && scrollBox) {
276
+ addItem(false) // Add at bottom
277
+ console.log("Added item at bottom")
278
+ } else if (key.name === "e" && scrollBox) {
279
+ clearAllItems() // Clear all items
280
+ }
281
+ })
282
+ }
283
+
284
+ export function destroy(rendererInstance: CliRenderer): void {
285
+ if (mainContainer) {
286
+ rendererInstance.root.remove(mainContainer.id)
287
+ mainContainer.destroyRecursively()
288
+ mainContainer = null
289
+ }
290
+
291
+ // Clean up animation
292
+ if (animationInterval) {
293
+ clearInterval(animationInterval)
294
+ animationInterval = null
295
+ }
296
+ animatedItems.clear()
297
+
298
+ renderer = null
299
+ }
300
+
301
+ if (import.meta.main) {
302
+ const renderer = await createCliRenderer({
303
+ exitOnCtrlC: true,
304
+ })
305
+
306
+ run(renderer)
307
+ setupCommonDemoKeys(renderer)
308
+ }
@@ -0,0 +1,282 @@
1
+ import {
2
+ CliRenderer,
3
+ createCliRenderer,
4
+ t,
5
+ blue,
6
+ bold,
7
+ underline,
8
+ red,
9
+ green,
10
+ bgYellow,
11
+ fg,
12
+ link,
13
+ BoxRenderable,
14
+ type KeyEvent,
15
+ } from "../index.js"
16
+ import { TextRenderable } from "../renderables/Text.js"
17
+ import { setupCommonDemoKeys } from "./lib/standalone-keys.js"
18
+
19
+ let parentContainer: BoxRenderable | null = null
20
+ let counter = 0
21
+ let frameCallback: ((deltaTime: number) => Promise<void>) | null = null
22
+ let updateFrequency = 1 // Updates per frame (1 = every frame, 2 = every 2 frames, etc.)
23
+ let complexTemplateCounter = 0
24
+ let startTime = Date.now()
25
+ let keyboardHandler: ((key: KeyEvent) => void) | null = null
26
+ let dashboardBox: BoxRenderable | null = null
27
+ let complexDisplay: TextRenderable | null = null
28
+
29
+ export function run(rendererInstance: CliRenderer): void {
30
+ const renderer = rendererInstance
31
+ renderer.start()
32
+ renderer.setBackgroundColor("#001122")
33
+
34
+ parentContainer = new BoxRenderable(renderer, {
35
+ id: "styled-text-container",
36
+ zIndex: 15,
37
+ })
38
+ renderer.root.add(parentContainer)
39
+
40
+ counter = 0
41
+
42
+ // Example 1
43
+ const houseText = t`
44
+ There's a ${underline(blue("house"))},
45
+ With a ${bold(blue("window"))},
46
+ And a ${blue("corvette")}
47
+ And everything is blue`
48
+
49
+ const houseDisplay = new TextRenderable(renderer, {
50
+ id: "house-text",
51
+ content: houseText,
52
+ width: 30,
53
+ height: 6,
54
+ position: "absolute",
55
+ left: 2,
56
+ top: 2,
57
+ zIndex: 1,
58
+ })
59
+ parentContainer.add(houseDisplay)
60
+
61
+ // Example 2
62
+ const statusText = t`${bold(red("ERROR:"))} Connection failed
63
+ ${bold(green("SUCCESS:"))} Data loaded
64
+ ${bold(fg("#FFA500")("WARNING:"))} Low memory
65
+ ${bgYellow(fg("black")(" NOTICE "))} System update available`
66
+
67
+ const statusDisplay = new TextRenderable(renderer, {
68
+ id: "status-text",
69
+ content: statusText,
70
+ width: 50,
71
+ height: 6,
72
+ position: "absolute",
73
+ left: 2,
74
+ top: 8,
75
+ zIndex: 1,
76
+ })
77
+ parentContainer.add(statusDisplay)
78
+
79
+ // Example 3 - Original dynamic text (updates every second)
80
+ dashboardBox = new BoxRenderable(renderer, {
81
+ id: "dashboard-box",
82
+ width: 72,
83
+ height: 21,
84
+ position: "absolute",
85
+ left: 2,
86
+ top: 27,
87
+ zIndex: 1,
88
+ backgroundColor: "#001122",
89
+ borderColor: "#00FFFF",
90
+ borderStyle: "single",
91
+ title: "COMPLEX REAL-TIME DASHBOARD",
92
+ titleAlignment: "center",
93
+ border: true,
94
+ })
95
+ parentContainer.add(dashboardBox)
96
+
97
+ const initialText = t`${bold("System Stats:")} ${fg("#888")("[Initializing...]")}
98
+ ${blue("Uptime:")} ${fg("#00FF00")("0.00")}s ${fg("#666")("(0m 0s)")}
99
+ ${red("CPU Load:")} ${green("0.0%")}
100
+ ${fg("#FF6B6B")("Memory:")} ${fg("#FFA500")("0.0%")}
101
+ ${fg("#9B59B6")("Network:")} ${fg("#FFA500")("0 KB/s")}
102
+ ${fg("#E74C3C")("Temp:")} ${blue("0.0°C")}
103
+ ${fg("#F39C12")("Battery:")} ${green("100%")}
104
+ ${underline("Connection:")} ${green(bold("ONLINE"))}
105
+ ${underline("Health:")} ${green(bold("GOOD"))}
106
+ ${underline("Alert:")} ${green(bold("NORMAL"))}
107
+ ${fg("#3498DB")("Random ID:")} ${fg("#E67E22")("0000")}
108
+ ${fg("#1ABC9C")("Wave:")} ${green("+0.00")}
109
+ ${fg("#9B59B6")("Progress:")} ${fg("#00FF00")("░".repeat(20))}
110
+ ${fg("#34495E")("Frame:")} ${fg("#ECF0F1")("0")} ${fg("#7F8C8D")("(Total: 0)")}
111
+ ${fg("#2ECC71")("Status:")} ${bold(fg("#E74C3C")("●"))} ${green("ALL SYSTEMS GO")}
112
+
113
+ ${bold(fg("#F1C40F")("Controls:"))} ${fg("#BDC3C7")("↑/↓ = Speed, ESC = Exit")}`
114
+
115
+ complexDisplay = new TextRenderable(renderer, {
116
+ id: "complex-template",
117
+ content: initialText,
118
+ left: 1,
119
+ top: 1,
120
+ zIndex: 1,
121
+ })
122
+ dashboardBox.add(complexDisplay)
123
+
124
+ frameCallback = async (deltaTime) => {
125
+ counter++
126
+ complexTemplateCounter++
127
+
128
+ if (counter % 60 === 0) {
129
+ // Update every second
130
+ const dynamicText = t`${bold("Frame:")} ${counter}
131
+ ${blue("Time:")} ${(counter / 60).toFixed(1)}s
132
+ ${underline("Dynamic:")} ${bold(fg("#FF6B6B")(Math.sin(counter * 0.1) > 0 ? "UP" : "DOWN"))}`
133
+
134
+ const dynamicDisplay = parentContainer?.getRenderable("dynamic-text") as TextRenderable
135
+ if (dynamicDisplay) {
136
+ dynamicDisplay.content = dynamicText
137
+ } else {
138
+ const newDynamicDisplay = new TextRenderable(renderer, {
139
+ id: "dynamic-text",
140
+ content: dynamicText,
141
+ width: 40,
142
+ height: 4,
143
+ position: "absolute",
144
+ left: 2,
145
+ top: 15,
146
+ zIndex: 1,
147
+ })
148
+ parentContainer?.add(newDynamicDisplay)
149
+ }
150
+ }
151
+
152
+ if (complexTemplateCounter % updateFrequency === 0 && complexDisplay) {
153
+ const currentTime = Date.now()
154
+ const elapsedMs = currentTime - startTime
155
+ const elapsedSeconds = elapsedMs / 1000
156
+
157
+ const cpuLoad = Math.sin(elapsedSeconds * 0.5) * 50 + 50
158
+ const memoryUsage = Math.cos(elapsedSeconds * 0.3) * 30 + 70
159
+ const networkSpeed = Math.abs(Math.sin(elapsedSeconds * 2)) * 1000
160
+ const temperature = Math.sin(elapsedSeconds * 0.1) * 20 + 60
161
+ const batteryLevel = Math.max(0, 100 - elapsedSeconds * 0.5)
162
+ const randomValue = Math.floor(Math.random() * 9999)
163
+ const waveValue = Math.sin(elapsedSeconds * 3) * 10
164
+ const progressBar = "█".repeat(Math.floor(((elapsedSeconds % 10) / 10) * 20))
165
+
166
+ const connectionStatus = Math.sin(elapsedSeconds) > 0 ? "ONLINE" : "OFFLINE"
167
+ const systemHealth = cpuLoad < 80 ? "GOOD" : "HIGH"
168
+ const alertLevel = temperature > 75 ? "CRITICAL" : "NORMAL"
169
+
170
+ const complexText = t`${bold("System Stats:")} ${fg("#888")(`[Update: ${updateFrequency === 1 ? "Every Frame" : `Every ${updateFrequency} frames`}]`)}
171
+ ${blue("Uptime:")} ${fg("#00FF00")(elapsedSeconds.toFixed(2))}s ${fg("#666")(`(${Math.floor(elapsedSeconds / 60)}m ${Math.floor(elapsedSeconds % 60)}s)`)}
172
+ ${red("CPU Load:")} ${cpuLoad > 80 ? red(bold(`${cpuLoad.toFixed(1)}%`)) : green(`${cpuLoad.toFixed(1)}%`)} ${fg("#444")("█".repeat(Math.floor(cpuLoad / 5)))}
173
+ ${fg("#FF6B6B")("Memory:")} ${memoryUsage > 85 ? red(bold(`${memoryUsage.toFixed(1)}%`)) : fg("#FFA500")(`${memoryUsage.toFixed(1)}%`)}
174
+ ${fg("#9B59B6")("Network:")} ${networkSpeed > 500 ? green(bold(`${networkSpeed.toFixed(0)} KB/s`)) : fg("#FFA500")(`${networkSpeed.toFixed(0)} KB/s`)}
175
+ ${fg("#E74C3C")("Temp:")} ${temperature > 75 ? red(bold(`${temperature.toFixed(1)}°C`)) : blue(`${temperature.toFixed(1)}°C`)}
176
+ ${fg("#F39C12")("Battery:")} ${batteryLevel < 20 ? red(bold(`${batteryLevel.toFixed(0)}%`)) : green(`${batteryLevel.toFixed(0)}%`)}
177
+ ${underline("Connection:")} ${connectionStatus === "ONLINE" ? green(bold(connectionStatus)) : red(bold(connectionStatus))}
178
+ ${underline("Health:")} ${systemHealth === "GOOD" ? green(bold(systemHealth)) : red(bold(systemHealth))}
179
+ ${underline("Alert:")} ${alertLevel === "NORMAL" ? green(bold(alertLevel)) : bgYellow(red(bold(alertLevel)))}
180
+ ${fg("#3498DB")("Random ID:")} ${fg("#E67E22")(randomValue.toString().padStart(4, "0"))}
181
+ ${fg("#1ABC9C")("Wave:")} ${waveValue >= 0 ? green(`+${waveValue.toFixed(2)}`) : red(waveValue.toFixed(2))}
182
+ ${fg("#9B59B6")("Progress:")} ${fg("#00FF00")(progressBar.padEnd(20, "░"))}
183
+ ${fg("#34495E")("Frame:")} ${fg("#ECF0F1")(complexTemplateCounter)} ${fg("#7F8C8D")(`(Total: ${counter})`)}
184
+ ${fg("#2ECC71")("Status:")} ${bold(fg("#E74C3C")("●"))} ${alertLevel === "CRITICAL" ? red("SYSTEM ALERT") : green("ALL SYSTEMS GO")}
185
+
186
+ ${bold(fg("#F1C40F")("Controls:"))} ${fg("#BDC3C7")("↑/↓ = Speed, ESC = Exit")}`
187
+
188
+ complexDisplay.content = complexText
189
+ }
190
+ }
191
+
192
+ renderer.setFrameCallback(frameCallback)
193
+
194
+ // Add keyboard controls for update frequency
195
+ keyboardHandler = (key: KeyEvent) => {
196
+ if (key.name === "up" || key.name === "arrowup") {
197
+ updateFrequency = Math.max(1, updateFrequency - 1)
198
+ } else if (key.name === "down" || key.name === "arrowdown") {
199
+ updateFrequency = Math.min(60, updateFrequency + 1)
200
+ }
201
+ }
202
+ rendererInstance.keyInput.on("keypress", keyboardHandler)
203
+
204
+ const instructionsText = t`${bold("Styled Text Demo")}
205
+ ${fg("#888")("ESC to return, ↑/↓ to control speed")}
206
+
207
+ ${underline("Features demonstrated:")}
208
+ • Template literals with ${blue("colors")}
209
+ • ${bold("Bold")}, ${underline("underlined")}, and other styles
210
+ • Background colors like ${bgYellow(fg("black")("this"))}
211
+ • Custom hex colors like ${fg("#FF6B6B")("this red")}
212
+ • Dynamic updates with ${green("controllable frequency")}
213
+ • Complex templates with ${red("many variables")}
214
+ • Hyperlinks: ${underline(blue(link("https://opentui.com")("opentui")))}`
215
+
216
+ const instructionsDisplay = new TextRenderable(renderer, {
217
+ id: "instructions",
218
+ content: instructionsText,
219
+ width: 60,
220
+ height: 12,
221
+ position: "absolute",
222
+ left: 40,
223
+ top: 2,
224
+ zIndex: 1,
225
+ fg: "#CCCCCC",
226
+ })
227
+ parentContainer.add(instructionsDisplay)
228
+
229
+ // Examples showing number and boolean support
230
+ const typesText = t`${bold("Type Examples:")}
231
+ Number: ${green(42)}
232
+ Boolean: ${red(true)}
233
+ Float: ${blue((3.14159).toFixed(2))}
234
+ Calculated: ${fg("#00FFFF")(Math.floor(Math.random() * 100))}`
235
+
236
+ const typesDisplay = new TextRenderable(renderer, {
237
+ id: "types-text",
238
+ content: typesText,
239
+ width: 30,
240
+ height: 6,
241
+ position: "absolute",
242
+ left: 2,
243
+ top: 20,
244
+ zIndex: 1,
245
+ })
246
+ parentContainer.add(typesDisplay)
247
+
248
+ renderer.requestRender()
249
+ }
250
+
251
+ export function destroy(rendererInstance: CliRenderer): void {
252
+ if (frameCallback) {
253
+ rendererInstance.removeFrameCallback(frameCallback)
254
+ frameCallback = null
255
+ }
256
+
257
+ if (keyboardHandler) {
258
+ rendererInstance.keyInput.off("keypress", keyboardHandler)
259
+ keyboardHandler = null
260
+ }
261
+
262
+ if (parentContainer) {
263
+ rendererInstance.root.remove("styled-text-container")
264
+ parentContainer = null
265
+ }
266
+
267
+ counter = 0
268
+ updateFrequency = 1
269
+ complexTemplateCounter = 0
270
+ startTime = Date.now()
271
+ dashboardBox = null
272
+ complexDisplay = null
273
+ }
274
+
275
+ if (import.meta.main) {
276
+ const renderer = await createCliRenderer({
277
+ exitOnCtrlC: true,
278
+ targetFps: 60,
279
+ })
280
+ run(renderer)
281
+ setupCommonDemoKeys(renderer)
282
+ }