@effect-tui/react 0.1.1 → 0.1.4

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 (442) hide show
  1. package/dist/jsx-runtime.d.ts +13 -0
  2. package/dist/jsx-runtime.d.ts.map +1 -1
  3. package/dist/jsx-runtime.js.map +1 -1
  4. package/dist/src/codeblock.d.ts.map +1 -1
  5. package/dist/src/codeblock.js.map +1 -1
  6. package/dist/src/components/Divider.d.ts +18 -0
  7. package/dist/src/components/Divider.d.ts.map +1 -0
  8. package/dist/src/components/Divider.js +17 -0
  9. package/dist/src/components/Divider.js.map +1 -0
  10. package/dist/src/components/Markdown.d.ts +66 -0
  11. package/dist/src/components/Markdown.d.ts.map +1 -0
  12. package/dist/src/components/Markdown.js +226 -0
  13. package/dist/src/components/Markdown.js.map +1 -0
  14. package/dist/src/components/MultilineTextInput.d.ts +65 -0
  15. package/dist/src/components/MultilineTextInput.d.ts.map +1 -0
  16. package/dist/src/components/MultilineTextInput.js +607 -0
  17. package/dist/src/components/MultilineTextInput.js.map +1 -0
  18. package/dist/src/components/Overlay.d.ts +46 -0
  19. package/dist/src/components/Overlay.d.ts.map +1 -0
  20. package/dist/src/components/Overlay.js +11 -0
  21. package/dist/src/components/Overlay.js.map +1 -0
  22. package/dist/src/components/Static.d.ts +44 -0
  23. package/dist/src/components/Static.d.ts.map +1 -0
  24. package/dist/src/components/Static.js +53 -0
  25. package/dist/src/components/Static.js.map +1 -0
  26. package/dist/src/components/TextInput.d.ts +53 -0
  27. package/dist/src/components/TextInput.d.ts.map +1 -0
  28. package/dist/src/components/TextInput.js +210 -0
  29. package/dist/src/components/TextInput.js.map +1 -0
  30. package/dist/src/components/index.d.ts +7 -0
  31. package/dist/src/components/index.d.ts.map +1 -0
  32. package/dist/src/components/index.js +7 -0
  33. package/dist/src/components/index.js.map +1 -0
  34. package/dist/src/components/text-editing.d.ts +62 -0
  35. package/dist/src/components/text-editing.d.ts.map +1 -0
  36. package/dist/src/components/text-editing.js +385 -0
  37. package/dist/src/components/text-editing.js.map +1 -0
  38. package/dist/src/console/ConsoleCapture.d.ts +36 -0
  39. package/dist/src/console/ConsoleCapture.d.ts.map +1 -0
  40. package/dist/src/console/ConsoleCapture.js +210 -0
  41. package/dist/src/console/ConsoleCapture.js.map +1 -0
  42. package/dist/src/console/ConsolePopover.d.ts +18 -0
  43. package/dist/src/console/ConsolePopover.d.ts.map +1 -0
  44. package/dist/src/console/ConsolePopover.js +324 -0
  45. package/dist/src/console/ConsolePopover.js.map +1 -0
  46. package/dist/src/console/clipboard.d.ts +10 -0
  47. package/dist/src/console/clipboard.d.ts.map +1 -0
  48. package/dist/src/console/clipboard.js +74 -0
  49. package/dist/src/console/clipboard.js.map +1 -0
  50. package/dist/src/console/index.d.ts +5 -0
  51. package/dist/src/console/index.d.ts.map +1 -0
  52. package/dist/src/console/index.js +33 -0
  53. package/dist/src/console/index.js.map +1 -0
  54. package/dist/src/console/useConsole.d.ts +44 -0
  55. package/dist/src/console/useConsole.d.ts.map +1 -0
  56. package/dist/src/console/useConsole.js +91 -0
  57. package/dist/src/console/useConsole.js.map +1 -0
  58. package/dist/src/debug/DebugOverlay.d.ts +49 -0
  59. package/dist/src/debug/DebugOverlay.d.ts.map +1 -0
  60. package/dist/src/debug/DebugOverlay.js +438 -0
  61. package/dist/src/debug/DebugOverlay.js.map +1 -0
  62. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -1
  63. package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
  64. package/dist/src/dev/Toast.d.ts +19 -0
  65. package/dist/src/dev/Toast.d.ts.map +1 -0
  66. package/dist/src/dev/Toast.js +72 -0
  67. package/dist/src/dev/Toast.js.map +1 -0
  68. package/dist/src/dev/index.d.ts +2 -0
  69. package/dist/src/dev/index.d.ts.map +1 -0
  70. package/dist/src/dev/index.js +3 -0
  71. package/dist/src/dev/index.js.map +1 -0
  72. package/dist/src/dev.d.ts +114 -0
  73. package/dist/src/dev.d.ts.map +1 -0
  74. package/dist/src/dev.js +373 -0
  75. package/dist/src/dev.js.map +1 -0
  76. package/dist/src/highlight.d.ts +3 -3
  77. package/dist/src/highlight.d.ts.map +1 -1
  78. package/dist/src/highlight.js.map +1 -1
  79. package/dist/src/hmr-plugin.d.ts +2 -0
  80. package/dist/src/hmr-plugin.d.ts.map +1 -0
  81. package/dist/src/hmr-plugin.js +53 -0
  82. package/dist/src/hmr-plugin.js.map +1 -0
  83. package/dist/src/hooks/index.d.ts +4 -0
  84. package/dist/src/hooks/index.d.ts.map +1 -1
  85. package/dist/src/hooks/index.js +2 -0
  86. package/dist/src/hooks/index.js.map +1 -1
  87. package/dist/src/hooks/use-keyboard.d.ts +11 -0
  88. package/dist/src/hooks/use-keyboard.d.ts.map +1 -1
  89. package/dist/src/hooks/use-keyboard.js +22 -4
  90. package/dist/src/hooks/use-keyboard.js.map +1 -1
  91. package/dist/src/hooks/use-mouse.d.ts +24 -0
  92. package/dist/src/hooks/use-mouse.d.ts.map +1 -0
  93. package/dist/src/hooks/use-mouse.js +41 -0
  94. package/dist/src/hooks/use-mouse.js.map +1 -0
  95. package/dist/src/hooks/use-paste.d.ts +11 -0
  96. package/dist/src/hooks/use-paste.d.ts.map +1 -1
  97. package/dist/src/hooks/use-paste.js +17 -3
  98. package/dist/src/hooks/use-paste.js.map +1 -1
  99. package/dist/src/hooks/use-scroll.d.ts +79 -0
  100. package/dist/src/hooks/use-scroll.d.ts.map +1 -0
  101. package/dist/src/hooks/use-scroll.js +239 -0
  102. package/dist/src/hooks/use-scroll.js.map +1 -0
  103. package/dist/src/hooks/useFrameStats.js.map +1 -1
  104. package/dist/src/hosts/base.d.ts +62 -1
  105. package/dist/src/hosts/base.d.ts.map +1 -1
  106. package/dist/src/hosts/base.js +118 -5
  107. package/dist/src/hosts/base.js.map +1 -1
  108. package/dist/src/hosts/box.d.ts +7 -7
  109. package/dist/src/hosts/box.d.ts.map +1 -1
  110. package/dist/src/hosts/box.js +31 -26
  111. package/dist/src/hosts/box.js.map +1 -1
  112. package/dist/src/hosts/canvas.d.ts +8 -8
  113. package/dist/src/hosts/canvas.d.ts.map +1 -1
  114. package/dist/src/hosts/canvas.js +13 -22
  115. package/dist/src/hosts/canvas.js.map +1 -1
  116. package/dist/src/hosts/codeblock.d.ts +7 -7
  117. package/dist/src/hosts/codeblock.d.ts.map +1 -1
  118. package/dist/src/hosts/codeblock.js +11 -20
  119. package/dist/src/hosts/codeblock.js.map +1 -1
  120. package/dist/src/hosts/flex-container.d.ts +45 -0
  121. package/dist/src/hosts/flex-container.d.ts.map +1 -0
  122. package/dist/src/hosts/flex-container.js +90 -0
  123. package/dist/src/hosts/flex-container.js.map +1 -0
  124. package/dist/src/hosts/hstack.d.ts +6 -11
  125. package/dist/src/hosts/hstack.d.ts.map +1 -1
  126. package/dist/src/hosts/hstack.js +6 -41
  127. package/dist/src/hosts/hstack.js.map +1 -1
  128. package/dist/src/hosts/index.d.ts +4 -0
  129. package/dist/src/hosts/index.d.ts.map +1 -1
  130. package/dist/src/hosts/index.js +10 -0
  131. package/dist/src/hosts/index.js.map +1 -1
  132. package/dist/src/hosts/overlay-item.d.ts +32 -0
  133. package/dist/src/hosts/overlay-item.d.ts.map +1 -0
  134. package/dist/src/hosts/overlay-item.js +54 -0
  135. package/dist/src/hosts/overlay-item.js.map +1 -0
  136. package/dist/src/hosts/overlay.d.ts +30 -0
  137. package/dist/src/hosts/overlay.d.ts.map +1 -0
  138. package/dist/src/hosts/overlay.js +105 -0
  139. package/dist/src/hosts/overlay.js.map +1 -0
  140. package/dist/src/hosts/scroll.d.ts +56 -0
  141. package/dist/src/hosts/scroll.d.ts.map +1 -0
  142. package/dist/src/hosts/scroll.js +204 -0
  143. package/dist/src/hosts/scroll.js.map +1 -0
  144. package/dist/src/hosts/single-child.d.ts +16 -0
  145. package/dist/src/hosts/single-child.d.ts.map +1 -0
  146. package/dist/src/hosts/single-child.js +45 -0
  147. package/dist/src/hosts/single-child.js.map +1 -0
  148. package/dist/src/hosts/spacer.d.ts.map +1 -1
  149. package/dist/src/hosts/spacer.js +7 -3
  150. package/dist/src/hosts/spacer.js.map +1 -1
  151. package/dist/src/hosts/text.d.ts +9 -6
  152. package/dist/src/hosts/text.d.ts.map +1 -1
  153. package/dist/src/hosts/text.js +49 -22
  154. package/dist/src/hosts/text.js.map +1 -1
  155. package/dist/src/hosts/vstack.d.ts +6 -11
  156. package/dist/src/hosts/vstack.d.ts.map +1 -1
  157. package/dist/src/hosts/vstack.js +6 -41
  158. package/dist/src/hosts/vstack.js.map +1 -1
  159. package/dist/src/hosts/zstack.d.ts.map +1 -1
  160. package/dist/src/hosts/zstack.js +16 -5
  161. package/dist/src/hosts/zstack.js.map +1 -1
  162. package/dist/src/index.d.ts +9 -2
  163. package/dist/src/index.d.ts.map +1 -1
  164. package/dist/src/index.js +10 -2
  165. package/dist/src/index.js.map +1 -1
  166. package/dist/src/inline/index.d.ts.map +1 -1
  167. package/dist/src/inline/index.js.map +1 -1
  168. package/dist/src/motion/color-motion-value.d.ts.map +1 -1
  169. package/dist/src/motion/color-motion-value.js.map +1 -1
  170. package/dist/src/motion/color.d.ts +1 -29
  171. package/dist/src/motion/color.d.ts.map +1 -1
  172. package/dist/src/motion/color.js +2 -170
  173. package/dist/src/motion/color.js.map +1 -1
  174. package/dist/src/motion/color.test.js.map +1 -1
  175. package/dist/src/motion/event-emitter.d.ts.map +1 -1
  176. package/dist/src/motion/event-emitter.js.map +1 -1
  177. package/dist/src/motion/frame.js.map +1 -1
  178. package/dist/src/motion/hooks.d.ts.map +1 -1
  179. package/dist/src/motion/hooks.js +8 -3
  180. package/dist/src/motion/hooks.js.map +1 -1
  181. package/dist/src/motion/index.d.ts.map +1 -1
  182. package/dist/src/motion/index.js.map +1 -1
  183. package/dist/src/motion/motion-value.d.ts.map +1 -1
  184. package/dist/src/motion/motion-value.js.map +1 -1
  185. package/dist/src/motion/motion-value.test.js.map +1 -1
  186. package/dist/src/motion/spring-math.d.ts +6 -1
  187. package/dist/src/motion/spring-math.d.ts.map +1 -1
  188. package/dist/src/motion/spring-math.js +6 -1
  189. package/dist/src/motion/spring-math.js.map +1 -1
  190. package/dist/src/motion/types.d.ts.map +1 -1
  191. package/dist/src/motion/types.js.map +1 -1
  192. package/dist/src/profiler.js.map +1 -1
  193. package/dist/src/reconciler/host-config.d.ts +5 -5
  194. package/dist/src/reconciler/host-config.d.ts.map +1 -1
  195. package/dist/src/reconciler/host-config.js +43 -51
  196. package/dist/src/reconciler/host-config.js.map +1 -1
  197. package/dist/src/reconciler/noop-methods.d.ts +29 -0
  198. package/dist/src/reconciler/noop-methods.d.ts.map +1 -0
  199. package/dist/src/reconciler/noop-methods.js +43 -0
  200. package/dist/src/reconciler/noop-methods.js.map +1 -0
  201. package/dist/src/reconciler/types.d.ts +68 -14
  202. package/dist/src/reconciler/types.d.ts.map +1 -1
  203. package/dist/src/remote/Procedures.d.ts +22 -0
  204. package/dist/src/remote/Procedures.d.ts.map +1 -0
  205. package/dist/src/remote/Procedures.js +42 -0
  206. package/dist/src/remote/Procedures.js.map +1 -0
  207. package/dist/src/remote/Router.d.ts +20 -0
  208. package/dist/src/remote/Router.d.ts.map +1 -0
  209. package/dist/src/remote/Router.js +26 -0
  210. package/dist/src/remote/Router.js.map +1 -0
  211. package/dist/src/remote/Server.d.ts +6 -0
  212. package/dist/src/remote/Server.d.ts.map +1 -0
  213. package/dist/src/remote/Server.js +53 -0
  214. package/dist/src/remote/Server.js.map +1 -0
  215. package/dist/src/remote/index.d.ts +18 -0
  216. package/dist/src/remote/index.d.ts.map +1 -0
  217. package/dist/src/remote/index.js +74 -0
  218. package/dist/src/remote/index.js.map +1 -0
  219. package/dist/src/renderer/core/FrameBuilder.d.ts +18 -0
  220. package/dist/src/renderer/core/FrameBuilder.d.ts.map +1 -0
  221. package/dist/src/renderer/core/FrameBuilder.js +38 -0
  222. package/dist/src/renderer/core/FrameBuilder.js.map +1 -0
  223. package/dist/src/renderer/core/RendererState.d.ts +41 -0
  224. package/dist/src/renderer/core/RendererState.d.ts.map +1 -0
  225. package/dist/src/renderer/core/RendererState.js +70 -0
  226. package/dist/src/renderer/core/RendererState.js.map +1 -0
  227. package/dist/src/renderer/core/index.d.ts +3 -0
  228. package/dist/src/renderer/core/index.d.ts.map +1 -0
  229. package/dist/src/renderer/core/index.js +3 -0
  230. package/dist/src/renderer/core/index.js.map +1 -0
  231. package/dist/src/renderer/input/InputProcessor.d.ts +25 -0
  232. package/dist/src/renderer/input/InputProcessor.d.ts.map +1 -0
  233. package/dist/src/renderer/input/InputProcessor.js +81 -0
  234. package/dist/src/renderer/input/InputProcessor.js.map +1 -0
  235. package/dist/src/renderer/input/index.d.ts +2 -0
  236. package/dist/src/renderer/input/index.d.ts.map +1 -0
  237. package/dist/src/renderer/input/index.js +2 -0
  238. package/dist/src/renderer/input/index.js.map +1 -0
  239. package/dist/src/renderer/lifecycle/EventBus.d.ts +41 -0
  240. package/dist/src/renderer/lifecycle/EventBus.d.ts.map +1 -0
  241. package/dist/src/renderer/lifecycle/EventBus.js +78 -0
  242. package/dist/src/renderer/lifecycle/EventBus.js.map +1 -0
  243. package/dist/src/renderer/lifecycle/ResizeManager.d.ts +34 -0
  244. package/dist/src/renderer/lifecycle/ResizeManager.d.ts.map +1 -0
  245. package/dist/src/renderer/lifecycle/ResizeManager.js +47 -0
  246. package/dist/src/renderer/lifecycle/ResizeManager.js.map +1 -0
  247. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts +36 -0
  248. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts.map +1 -0
  249. package/dist/src/renderer/lifecycle/TerminalSetup.js +82 -0
  250. package/dist/src/renderer/lifecycle/TerminalSetup.js.map +1 -0
  251. package/dist/src/renderer/lifecycle/index.d.ts +4 -0
  252. package/dist/src/renderer/lifecycle/index.d.ts.map +1 -0
  253. package/dist/src/renderer/lifecycle/index.js +4 -0
  254. package/dist/src/renderer/lifecycle/index.js.map +1 -0
  255. package/dist/src/renderer/modes/FullscreenRenderer.d.ts +12 -0
  256. package/dist/src/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
  257. package/dist/src/renderer/modes/FullscreenRenderer.js +52 -0
  258. package/dist/src/renderer/modes/FullscreenRenderer.js.map +1 -0
  259. package/dist/src/renderer/modes/InlineRenderer.d.ts +22 -0
  260. package/dist/src/renderer/modes/InlineRenderer.d.ts.map +1 -0
  261. package/dist/src/renderer/modes/InlineRenderer.js +154 -0
  262. package/dist/src/renderer/modes/InlineRenderer.js.map +1 -0
  263. package/dist/src/renderer/modes/RendererMode.d.ts +42 -0
  264. package/dist/src/renderer/modes/RendererMode.d.ts.map +1 -0
  265. package/dist/src/renderer/modes/RendererMode.js +2 -0
  266. package/dist/src/renderer/modes/RendererMode.js.map +1 -0
  267. package/dist/src/renderer/modes/StaticContentRenderer.d.ts +25 -0
  268. package/dist/src/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
  269. package/dist/src/renderer/modes/StaticContentRenderer.js +47 -0
  270. package/dist/src/renderer/modes/StaticContentRenderer.js.map +1 -0
  271. package/dist/src/renderer/modes/index.d.ts +5 -0
  272. package/dist/src/renderer/modes/index.d.ts.map +1 -0
  273. package/dist/src/renderer/modes/index.js +4 -0
  274. package/dist/src/renderer/modes/index.js.map +1 -0
  275. package/dist/src/renderer-context.d.ts +9 -0
  276. package/dist/src/renderer-context.d.ts.map +1 -0
  277. package/dist/src/renderer-context.js +22 -0
  278. package/dist/src/renderer-context.js.map +1 -0
  279. package/dist/src/renderer-types.d.ts +103 -0
  280. package/dist/src/renderer-types.d.ts.map +1 -0
  281. package/dist/src/renderer-types.js +2 -0
  282. package/dist/src/renderer-types.js.map +1 -0
  283. package/dist/src/renderer.d.ts +4 -86
  284. package/dist/src/renderer.d.ts.map +1 -1
  285. package/dist/src/renderer.js +213 -384
  286. package/dist/src/renderer.js.map +1 -1
  287. package/dist/src/test/index.d.ts.map +1 -1
  288. package/dist/src/test/index.js.map +1 -1
  289. package/dist/src/test/mock-streams.d.ts.map +1 -1
  290. package/dist/src/test/mock-streams.js.map +1 -1
  291. package/dist/src/test/render-tui.d.ts.map +1 -1
  292. package/dist/src/test/render-tui.js +2 -5
  293. package/dist/src/test/render-tui.js.map +1 -1
  294. package/dist/src/trace/SpanTree.d.ts.map +1 -1
  295. package/dist/src/trace/SpanTree.js +21 -11
  296. package/dist/src/trace/SpanTree.js.map +1 -1
  297. package/dist/src/trace/format-value.d.ts +15 -0
  298. package/dist/src/trace/format-value.d.ts.map +1 -0
  299. package/dist/src/trace/format-value.js +77 -0
  300. package/dist/src/trace/format-value.js.map +1 -0
  301. package/dist/src/trace/index.d.ts.map +1 -1
  302. package/dist/src/trace/index.js.map +1 -1
  303. package/dist/src/trace/location.js +1 -1
  304. package/dist/src/trace/location.js.map +1 -1
  305. package/dist/src/trace/span-processor.d.ts.map +1 -1
  306. package/dist/src/trace/span-processor.js.map +1 -1
  307. package/dist/src/trace/span-state.d.ts +19 -2
  308. package/dist/src/trace/span-state.d.ts.map +1 -1
  309. package/dist/src/trace/span-state.js +62 -31
  310. package/dist/src/trace/span-state.js.map +1 -1
  311. package/dist/src/trace/tui-logger.js.map +1 -1
  312. package/dist/src/utils/border.d.ts +1 -1
  313. package/dist/src/utils/border.d.ts.map +1 -1
  314. package/dist/src/utils/border.js +6 -0
  315. package/dist/src/utils/border.js.map +1 -1
  316. package/dist/src/utils/flex-layout.d.ts +2 -1
  317. package/dist/src/utils/flex-layout.d.ts.map +1 -1
  318. package/dist/src/utils/flex-layout.js +22 -33
  319. package/dist/src/utils/flex-layout.js.map +1 -1
  320. package/dist/src/utils/index.d.ts +1 -1
  321. package/dist/src/utils/index.d.ts.map +1 -1
  322. package/dist/src/utils/index.js +1 -1
  323. package/dist/src/utils/index.js.map +1 -1
  324. package/dist/src/utils/padding.d.ts.map +1 -1
  325. package/dist/src/utils/padding.js.map +1 -1
  326. package/dist/src/utils/styles.d.ts +20 -1
  327. package/dist/src/utils/styles.d.ts.map +1 -1
  328. package/dist/src/utils/styles.js +36 -1
  329. package/dist/src/utils/styles.js.map +1 -1
  330. package/dist/src/visualize/index.d.ts +8 -19
  331. package/dist/src/visualize/index.d.ts.map +1 -1
  332. package/dist/src/visualize/index.js +11 -25
  333. package/dist/src/visualize/index.js.map +1 -1
  334. package/dist/tsconfig.tsbuildinfo +1 -1
  335. package/jsx-dev-runtime.ts +5 -0
  336. package/jsx-runtime.ts +54 -0
  337. package/package.json +124 -92
  338. package/src/codeblock.tsx +34 -34
  339. package/src/components/Divider.tsx +23 -0
  340. package/src/components/Markdown.tsx +380 -0
  341. package/src/components/MultilineTextInput.tsx +749 -0
  342. package/src/components/Overlay.tsx +56 -0
  343. package/src/components/Static.tsx +68 -0
  344. package/src/components/TextInput.tsx +285 -0
  345. package/src/components/index.ts +6 -0
  346. package/src/components/text-editing.ts +464 -0
  347. package/src/console/ConsoleCapture.ts +272 -0
  348. package/src/console/ConsolePopover.tsx +487 -0
  349. package/src/console/clipboard.ts +81 -0
  350. package/src/console/index.ts +42 -0
  351. package/src/console/useConsole.ts +129 -0
  352. package/src/debug/DebugOverlay.ts +557 -0
  353. package/src/debug/DiagnosticsPanel.tsx +27 -27
  354. package/src/dev/Toast.tsx +117 -0
  355. package/src/dev/index.ts +2 -0
  356. package/src/dev.tsx +489 -0
  357. package/src/highlight.ts +46 -46
  358. package/src/hmr-plugin.ts +61 -0
  359. package/src/hooks/index.ts +4 -0
  360. package/src/hooks/use-keyboard.ts +44 -24
  361. package/src/hooks/use-mouse.ts +51 -0
  362. package/src/hooks/use-paste.ts +21 -6
  363. package/src/hooks/use-scroll.ts +386 -0
  364. package/src/hooks/useFrameStats.ts +17 -17
  365. package/src/hosts/base.ts +180 -59
  366. package/src/hosts/box.ts +117 -96
  367. package/src/hosts/canvas.ts +137 -141
  368. package/src/hosts/codeblock.ts +117 -133
  369. package/src/hosts/flex-container.ts +124 -0
  370. package/src/hosts/hstack.ts +11 -59
  371. package/src/hosts/index.ts +24 -14
  372. package/src/hosts/overlay-item.ts +72 -0
  373. package/src/hosts/overlay.ts +125 -0
  374. package/src/hosts/scroll.ts +255 -0
  375. package/src/hosts/single-child.ts +52 -0
  376. package/src/hosts/spacer.ts +30 -26
  377. package/src/hosts/text.ts +198 -164
  378. package/src/hosts/vstack.ts +11 -59
  379. package/src/hosts/zstack.ts +79 -67
  380. package/src/index.ts +44 -19
  381. package/src/inline/index.tsx +123 -123
  382. package/src/motion/color-motion-value.ts +67 -67
  383. package/src/motion/color.test.ts +107 -107
  384. package/src/motion/color.ts +9 -190
  385. package/src/motion/event-emitter.ts +20 -20
  386. package/src/motion/frame.ts +35 -35
  387. package/src/motion/hooks.ts +144 -139
  388. package/src/motion/index.ts +10 -10
  389. package/src/motion/motion-value.test.ts +207 -207
  390. package/src/motion/motion-value.ts +112 -112
  391. package/src/motion/spring-math.ts +88 -83
  392. package/src/motion/types.ts +25 -25
  393. package/src/profiler.ts +50 -50
  394. package/src/reconciler/host-config.ts +152 -174
  395. package/src/reconciler/noop-methods.ts +55 -0
  396. package/src/reconciler/types.ts +112 -46
  397. package/src/remote/Procedures.ts +52 -0
  398. package/src/remote/Router.ts +58 -0
  399. package/src/remote/Server.ts +76 -0
  400. package/src/remote/index.ts +90 -0
  401. package/src/renderer/core/FrameBuilder.ts +49 -0
  402. package/src/renderer/core/RendererState.ts +80 -0
  403. package/src/renderer/core/index.ts +2 -0
  404. package/src/renderer/input/InputProcessor.ts +94 -0
  405. package/src/renderer/input/index.ts +1 -0
  406. package/src/renderer/lifecycle/EventBus.ts +90 -0
  407. package/src/renderer/lifecycle/ResizeManager.ts +65 -0
  408. package/src/renderer/lifecycle/TerminalSetup.ts +105 -0
  409. package/src/renderer/lifecycle/index.ts +3 -0
  410. package/src/renderer/modes/FullscreenRenderer.ts +53 -0
  411. package/src/renderer/modes/InlineRenderer.ts +178 -0
  412. package/src/renderer/modes/RendererMode.ts +46 -0
  413. package/src/renderer/modes/StaticContentRenderer.ts +56 -0
  414. package/src/renderer/modes/index.ts +4 -0
  415. package/src/renderer-context.ts +27 -0
  416. package/src/renderer-types.ts +109 -0
  417. package/src/renderer.ts +391 -642
  418. package/src/test/index.ts +5 -5
  419. package/src/test/mock-streams.ts +115 -115
  420. package/src/test/render-tui.ts +84 -87
  421. package/src/utils/border.ts +79 -73
  422. package/src/utils/flex-layout.ts +80 -93
  423. package/src/utils/index.ts +1 -1
  424. package/src/utils/padding.ts +27 -27
  425. package/src/utils/styles.ts +50 -7
  426. package/src/visualize/index.tsx +225 -240
  427. package/dist/src/output.d.ts +0 -47
  428. package/dist/src/output.d.ts.map +0 -1
  429. package/dist/src/output.js +0 -125
  430. package/dist/src/output.js.map +0 -1
  431. package/dist/src/terminal.d.ts +0 -37
  432. package/dist/src/terminal.d.ts.map +0 -1
  433. package/dist/src/terminal.js +0 -65
  434. package/dist/src/terminal.js.map +0 -1
  435. package/src/output.ts +0 -156
  436. package/src/terminal.ts +0 -67
  437. package/src/trace/SpanTree.tsx +0 -195
  438. package/src/trace/index.tsx +0 -205
  439. package/src/trace/location.ts +0 -90
  440. package/src/trace/span-processor.ts +0 -65
  441. package/src/trace/span-state.ts +0 -286
  442. package/src/trace/tui-logger.ts +0 -72
@@ -0,0 +1,464 @@
1
+ /**
2
+ * Pure functions for text editing operations.
3
+ * These are used by TextInput and MultilineTextInput components.
4
+ * Being pure functions makes them easy to test.
5
+ */
6
+
7
+ import { graphemes } from "@effect-tui/core"
8
+
9
+ // ============================================================================
10
+ // Types
11
+ // ============================================================================
12
+
13
+ /** Single-line text state */
14
+ export interface TextState {
15
+ text: string
16
+ cursor: number // character index
17
+ killRing: string
18
+ }
19
+
20
+ /** Multi-line text state */
21
+ export interface MultilineState {
22
+ lines: string[]
23
+ cursor: { row: number; col: number } // col is grapheme index
24
+ killRing: string
25
+ }
26
+
27
+ /** Result of an edit operation */
28
+ export interface EditResult<T> {
29
+ state: T
30
+ changed: boolean
31
+ }
32
+
33
+ // ============================================================================
34
+ // Word boundary helpers (shared by TextInput and MultilineTextInput)
35
+ // ============================================================================
36
+
37
+ /** Match the previous word (and trailing whitespace) or whitespace-only chunk. */
38
+ export function matchPrevWord(beforeCursor: string): string | null {
39
+ return beforeCursor.match(/(\S+\s*|\s+)$/)?.[0] ?? null
40
+ }
41
+
42
+ /** Match the next word (including leading whitespace). */
43
+ export function matchNextWord(afterCursor: string): string | null {
44
+ return afterCursor.match(/^\s*\S+/)?.[0] ?? null
45
+ }
46
+
47
+ // ============================================================================
48
+ // Single-line operations (for TextInput)
49
+ // ============================================================================
50
+
51
+ /** Delete word backward */
52
+ export function deleteWordBackward(state: TextState): EditResult<TextState> {
53
+ const { text, cursor } = state
54
+ if (cursor <= 0) {
55
+ return { state, changed: false }
56
+ }
57
+
58
+ const beforeCursor = text.slice(0, cursor)
59
+ const match = matchPrevWord(beforeCursor)
60
+
61
+ if (!match) {
62
+ return { state, changed: false }
63
+ }
64
+
65
+ const newCursor = cursor - match.length
66
+ const newText = text.slice(0, newCursor) + text.slice(cursor)
67
+
68
+ return {
69
+ state: { text: newText, cursor: newCursor, killRing: match },
70
+ changed: true,
71
+ }
72
+ }
73
+
74
+ /** Kill to end of line */
75
+ export function killToEnd(state: TextState): EditResult<TextState> {
76
+ const { text, cursor } = state
77
+ const killed = text.slice(cursor)
78
+
79
+ if (!killed) {
80
+ return { state, changed: false }
81
+ }
82
+
83
+ return {
84
+ state: { text: text.slice(0, cursor), cursor, killRing: killed },
85
+ changed: true,
86
+ }
87
+ }
88
+
89
+ /** Kill to start of line */
90
+ export function killToStart(state: TextState): EditResult<TextState> {
91
+ const { text, cursor } = state
92
+ const killed = text.slice(0, cursor)
93
+
94
+ if (!killed) {
95
+ return { state, changed: false }
96
+ }
97
+
98
+ return {
99
+ state: { text: text.slice(cursor), cursor: 0, killRing: killed },
100
+ changed: true,
101
+ }
102
+ }
103
+
104
+ /** Delete character at cursor */
105
+ export function deleteCharForward(state: TextState): EditResult<TextState> {
106
+ const { text, cursor, killRing } = state
107
+ if (cursor >= text.length) {
108
+ return { state, changed: false }
109
+ }
110
+
111
+ const newText = text.slice(0, cursor) + text.slice(cursor + 1)
112
+ return {
113
+ state: { text: newText, cursor, killRing },
114
+ changed: true,
115
+ }
116
+ }
117
+
118
+ /** Delete character before cursor */
119
+ export function deleteCharBackward(state: TextState): EditResult<TextState> {
120
+ const { text, cursor, killRing } = state
121
+ if (cursor <= 0) {
122
+ return { state, changed: false }
123
+ }
124
+
125
+ const newText = text.slice(0, cursor - 1) + text.slice(cursor)
126
+ return {
127
+ state: { text: newText, cursor: cursor - 1, killRing },
128
+ changed: true,
129
+ }
130
+ }
131
+
132
+ /** Transpose characters before cursor */
133
+ export function transposeChars(state: TextState): EditResult<TextState> {
134
+ const { text, cursor, killRing } = state
135
+ if (cursor <= 0 || text.length < 2) {
136
+ return { state, changed: false }
137
+ }
138
+
139
+ let newText: string
140
+ let newCursor = cursor
141
+
142
+ if (cursor === text.length) {
143
+ // At end: swap last two chars
144
+ newText = text.slice(0, cursor - 2) + text[cursor - 1] + text[cursor - 2]
145
+ } else {
146
+ // Swap char before cursor with char at cursor
147
+ newText = text.slice(0, cursor - 1) + text[cursor] + text[cursor - 1] + text.slice(cursor + 1)
148
+ newCursor = cursor + 1
149
+ }
150
+
151
+ return {
152
+ state: { text: newText, cursor: newCursor, killRing },
153
+ changed: true,
154
+ }
155
+ }
156
+
157
+ /** Insert text at cursor (yank) */
158
+ export function insertText(state: TextState, toInsert: string): EditResult<TextState> {
159
+ const { text, cursor, killRing } = state
160
+ if (!toInsert) {
161
+ return { state, changed: false }
162
+ }
163
+
164
+ const newText = text.slice(0, cursor) + toInsert + text.slice(cursor)
165
+ return {
166
+ state: { text: newText, cursor: cursor + toInsert.length, killRing },
167
+ changed: true,
168
+ }
169
+ }
170
+
171
+ // ============================================================================
172
+ // Multi-line operations (for MultilineTextInput)
173
+ // ============================================================================
174
+
175
+ /** Convert grapheme column to character index in a line */
176
+ export function graphemeColToCharIdx(line: string, col: number): number {
177
+ const gs = graphemes(line)
178
+ return gs.slice(0, col).join("").length
179
+ }
180
+
181
+ /** Convert character index to grapheme column */
182
+ export function charIdxToGraphemeCol(line: string, charIdx: number): number {
183
+ return graphemes(line.slice(0, charIdx)).length
184
+ }
185
+
186
+ /** Delete word backward in multiline (crosses line boundaries) */
187
+ export function deleteWordBackwardMultiline(state: MultilineState): EditResult<MultilineState> {
188
+ const { lines, cursor } = state
189
+
190
+ if (cursor.col > 0) {
191
+ // Delete on current line
192
+ const line = lines[cursor.row]
193
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
194
+ const beforeCursor = line.slice(0, charIdx)
195
+ const match = matchPrevWord(beforeCursor)
196
+
197
+ if (!match) {
198
+ return { state, changed: false }
199
+ }
200
+
201
+ const newCharIdx = charIdx - match.length
202
+ const newCol = charIdxToGraphemeCol(line, newCharIdx)
203
+ const newLine = line.slice(0, newCharIdx) + line.slice(charIdx)
204
+ const newLines = [...lines]
205
+ newLines[cursor.row] = newLine
206
+
207
+ return {
208
+ state: {
209
+ lines: newLines,
210
+ cursor: { row: cursor.row, col: newCol },
211
+ killRing: match,
212
+ },
213
+ changed: true,
214
+ }
215
+ } else if (cursor.row > 0) {
216
+ // At start of line - delete last word of previous line + newline
217
+ const prevLine = lines[cursor.row - 1]
218
+ const currentLine = lines[cursor.row]
219
+ const match = matchPrevWord(prevLine)
220
+
221
+ if (match) {
222
+ const killed = match + "\n"
223
+ const newPrevLine = prevLine.slice(0, prevLine.length - match.length)
224
+ const newLines = [...lines]
225
+ newLines[cursor.row - 1] = newPrevLine + currentLine
226
+ newLines.splice(cursor.row, 1)
227
+ const newCol = graphemes(newPrevLine).length
228
+
229
+ return {
230
+ state: {
231
+ lines: newLines,
232
+ cursor: { row: cursor.row - 1, col: newCol },
233
+ killRing: killed,
234
+ },
235
+ changed: true,
236
+ }
237
+ } else {
238
+ // Previous line is empty - just kill the newline
239
+ const newLines = [...lines]
240
+ newLines[cursor.row - 1] = prevLine + currentLine
241
+ newLines.splice(cursor.row, 1)
242
+
243
+ return {
244
+ state: {
245
+ lines: newLines,
246
+ cursor: { row: cursor.row - 1, col: graphemes(prevLine).length },
247
+ killRing: "\n",
248
+ },
249
+ changed: true,
250
+ }
251
+ }
252
+ }
253
+
254
+ return { state, changed: false }
255
+ }
256
+
257
+ /** Kill to end of line in multiline */
258
+ export function killToEndMultiline(state: MultilineState): EditResult<MultilineState> {
259
+ const { lines, cursor } = state
260
+ const line = lines[cursor.row]
261
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
262
+ const killed = line.slice(charIdx)
263
+
264
+ if (killed) {
265
+ const newLine = line.slice(0, charIdx)
266
+ const newLines = [...lines]
267
+ newLines[cursor.row] = newLine
268
+ return {
269
+ state: { lines: newLines, cursor, killRing: killed },
270
+ changed: true,
271
+ }
272
+ } else if (cursor.row < lines.length - 1) {
273
+ // At end of line - kill the newline (join with next)
274
+ const newLines = [...lines]
275
+ newLines[cursor.row] = line + lines[cursor.row + 1]
276
+ newLines.splice(cursor.row + 1, 1)
277
+ return {
278
+ state: { lines: newLines, cursor, killRing: "\n" },
279
+ changed: true,
280
+ }
281
+ }
282
+
283
+ return { state, changed: false }
284
+ }
285
+
286
+ /** Kill to start of line in multiline */
287
+ export function killToStartMultiline(state: MultilineState): EditResult<MultilineState> {
288
+ const { lines, cursor } = state
289
+ const line = lines[cursor.row]
290
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
291
+ const killed = line.slice(0, charIdx)
292
+
293
+ if (!killed) {
294
+ return { state, changed: false }
295
+ }
296
+
297
+ const newLine = line.slice(charIdx)
298
+ const newLines = [...lines]
299
+ newLines[cursor.row] = newLine
300
+
301
+ return {
302
+ state: {
303
+ lines: newLines,
304
+ cursor: { row: cursor.row, col: 0 },
305
+ killRing: killed,
306
+ },
307
+ changed: true,
308
+ }
309
+ }
310
+
311
+ /** Transpose characters in multiline */
312
+ export function transposeCharsMultiline(state: MultilineState): EditResult<MultilineState> {
313
+ const { lines, cursor, killRing } = state
314
+ const line = lines[cursor.row]
315
+ const gs = graphemes(line)
316
+
317
+ if (cursor.col <= 0 || gs.length < 2) {
318
+ return { state, changed: false }
319
+ }
320
+
321
+ let newGs: string[]
322
+ let newCol = cursor.col
323
+
324
+ if (cursor.col === gs.length) {
325
+ // At end: swap last two chars
326
+ newGs = [...gs.slice(0, cursor.col - 2), gs[cursor.col - 1], gs[cursor.col - 2]]
327
+ } else {
328
+ // Swap char before cursor with char at cursor
329
+ newGs = [...gs.slice(0, cursor.col - 1), gs[cursor.col], gs[cursor.col - 1], ...gs.slice(cursor.col + 1)]
330
+ newCol = cursor.col + 1
331
+ }
332
+
333
+ const newLines = [...lines]
334
+ newLines[cursor.row] = newGs.join("")
335
+
336
+ return {
337
+ state: {
338
+ lines: newLines,
339
+ cursor: { row: cursor.row, col: newCol },
340
+ killRing,
341
+ },
342
+ changed: true,
343
+ }
344
+ }
345
+
346
+ /** Delete character at cursor in multiline (joins lines if at end) */
347
+ export function deleteCharForwardMultiline(state: MultilineState): EditResult<MultilineState> {
348
+ const { lines, cursor, killRing } = state
349
+ const line = lines[cursor.row]
350
+ const gs = graphemes(line)
351
+
352
+ if (cursor.col < gs.length) {
353
+ // Delete char at cursor
354
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
355
+ const nextCharIdx = graphemeColToCharIdx(line, cursor.col + 1)
356
+ const newLine = line.slice(0, charIdx) + line.slice(nextCharIdx)
357
+ const newLines = [...lines]
358
+ newLines[cursor.row] = newLine
359
+ return {
360
+ state: { lines: newLines, cursor, killRing },
361
+ changed: true,
362
+ }
363
+ } else if (cursor.row < lines.length - 1) {
364
+ // Join with next line
365
+ const newLines = [...lines]
366
+ newLines[cursor.row] = line + lines[cursor.row + 1]
367
+ newLines.splice(cursor.row + 1, 1)
368
+ return {
369
+ state: { lines: newLines, cursor, killRing },
370
+ changed: true,
371
+ }
372
+ }
373
+
374
+ return { state, changed: false }
375
+ }
376
+
377
+ /** Delete character before cursor in multiline (joins with previous line if at start) */
378
+ export function deleteCharBackwardMultiline(state: MultilineState): EditResult<MultilineState> {
379
+ const { lines, cursor, killRing } = state
380
+ const line = lines[cursor.row]
381
+
382
+ if (cursor.col > 0) {
383
+ // Delete char before cursor
384
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
385
+ const prevCharIdx = graphemeColToCharIdx(line, cursor.col - 1)
386
+ const newLine = line.slice(0, prevCharIdx) + line.slice(charIdx)
387
+ const newLines = [...lines]
388
+ newLines[cursor.row] = newLine
389
+ return {
390
+ state: {
391
+ lines: newLines,
392
+ cursor: { row: cursor.row, col: cursor.col - 1 },
393
+ killRing,
394
+ },
395
+ changed: true,
396
+ }
397
+ } else if (cursor.row > 0) {
398
+ // Join with previous line
399
+ const prevLine = lines[cursor.row - 1]
400
+ const prevCol = graphemes(prevLine).length
401
+ const newLines = [...lines]
402
+ newLines[cursor.row - 1] = prevLine + line
403
+ newLines.splice(cursor.row, 1)
404
+ return {
405
+ state: {
406
+ lines: newLines,
407
+ cursor: { row: cursor.row - 1, col: prevCol },
408
+ killRing,
409
+ },
410
+ changed: true,
411
+ }
412
+ }
413
+
414
+ return { state, changed: false }
415
+ }
416
+
417
+ /** Insert text at cursor in multiline (handles newlines) */
418
+ export function insertTextMultiline(state: MultilineState, toInsert: string): EditResult<MultilineState> {
419
+ const { lines, cursor, killRing } = state
420
+ if (!toInsert) {
421
+ return { state, changed: false }
422
+ }
423
+
424
+ const line = lines[cursor.row]
425
+ const charIdx = graphemeColToCharIdx(line, cursor.col)
426
+ const beforeCursor = line.slice(0, charIdx)
427
+ const afterCursor = line.slice(charIdx)
428
+
429
+ const insertLines = toInsert.split("\n")
430
+
431
+ if (insertLines.length === 1) {
432
+ // No newlines - simple insert
433
+ const newLine = beforeCursor + toInsert + afterCursor
434
+ const newLines = [...lines]
435
+ newLines[cursor.row] = newLine
436
+ return {
437
+ state: {
438
+ lines: newLines,
439
+ cursor: { row: cursor.row, col: cursor.col + graphemes(toInsert).length },
440
+ killRing,
441
+ },
442
+ changed: true,
443
+ }
444
+ }
445
+
446
+ // Has newlines - split into multiple lines
447
+ const newLines = [...lines]
448
+ newLines[cursor.row] = beforeCursor + insertLines[0]
449
+ const middleLines = insertLines.slice(1, -1)
450
+ const lastInsertLine = insertLines[insertLines.length - 1]
451
+ newLines.splice(cursor.row + 1, 0, ...middleLines, lastInsertLine + afterCursor)
452
+
453
+ return {
454
+ state: {
455
+ lines: newLines,
456
+ cursor: {
457
+ row: cursor.row + insertLines.length - 1,
458
+ col: graphemes(lastInsertLine).length,
459
+ },
460
+ killRing,
461
+ },
462
+ changed: true,
463
+ }
464
+ }