@effect-tui/react 0.1.3 → 0.1.5

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 +55 -0
  27. package/dist/src/components/TextInput.d.ts.map +1 -0
  28. package/dist/src/components/TextInput.js +277 -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 +30 -23
  111. package/dist/src/hosts/box.js.map +1 -1
  112. package/dist/src/hosts/canvas.d.ts +16 -8
  113. package/dist/src/hosts/canvas.d.ts.map +1 -1
  114. package/dist/src/hosts/canvas.js +27 -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 +25 -0
  260. package/dist/src/renderer/modes/InlineRenderer.d.ts.map +1 -0
  261. package/dist/src/renderer/modes/InlineRenderer.js +161 -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 +214 -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 +356 -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 -94
  367. package/src/hosts/canvas.ts +170 -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 +186 -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 +392 -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,56 @@
1
+ /**
2
+ * Overlay compound component - SwiftUI-style overlay layout
3
+ *
4
+ * Unlike ZStack (which sizes to MAX of all children), Overlay:
5
+ * 1. First child is the "base" - determines the container size
6
+ * 2. Overlay.Item children are overlaid without affecting measurement
7
+ * 3. Each Overlay.Item specifies its own alignment
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <Overlay>
12
+ * <MainContent />
13
+ * <Overlay.Item alignment={{ v: "top" }}>
14
+ * <Toast />
15
+ * </Overlay.Item>
16
+ * <Overlay.Item alignment={{ v: "bottom" }}>
17
+ * <Console />
18
+ * </Overlay.Item>
19
+ * </Overlay>
20
+ * ```
21
+ */
22
+
23
+ import type { ReactNode } from "react"
24
+
25
+ type HAlign = "left" | "center" | "right"
26
+ type VAlign = "top" | "center" | "bottom"
27
+
28
+ export interface OverlayProps {
29
+ children?: ReactNode
30
+ /** Fixed width */
31
+ width?: number
32
+ /** Fixed height */
33
+ height?: number
34
+ }
35
+
36
+ export interface OverlayItemProps {
37
+ /** Alignment within the overlay container */
38
+ alignment?: { h?: HAlign; v?: VAlign }
39
+ children?: ReactNode
40
+ }
41
+
42
+ function OverlayRoot({ children, ...props }: OverlayProps) {
43
+ return <overlay {...props}>{children}</overlay>
44
+ }
45
+
46
+ function OverlayItem({ children, alignment, ...props }: OverlayItemProps) {
47
+ return (
48
+ <overlayItem alignment={alignment} {...props}>
49
+ {children}
50
+ </overlayItem>
51
+ )
52
+ }
53
+
54
+ export const Overlay = Object.assign(OverlayRoot, {
55
+ Item: OverlayItem,
56
+ })
@@ -0,0 +1,68 @@
1
+ import { useState, useMemo, useLayoutEffect, type ReactNode } from "react"
2
+
3
+ export interface StaticProps<T> {
4
+ /**
5
+ * Array of items to render. Items should only be appended, not removed or modified.
6
+ * Each new item is rendered once and then "printed" to scrollback.
7
+ */
8
+ items: T[]
9
+ /**
10
+ * Render function for each item. Must return a keyed element.
11
+ */
12
+ children: (item: T, index: number) => ReactNode
13
+ }
14
+
15
+ /**
16
+ * Renders items to terminal scrollback (inline mode only).
17
+ *
18
+ * Static content is printed once and scrolls up as new items are added,
19
+ * while dynamic content below it re-renders in place. Great for:
20
+ * - Build tools (completed steps scroll up, spinner at bottom)
21
+ * - Test runners (passed tests scroll up, current test at bottom)
22
+ * - Log viewers (history accumulates, live tail at bottom)
23
+ *
24
+ * **Important:** Static must be used at the root level of your component tree,
25
+ * as a direct child of a Fragment or the root element. Do not nest it inside
26
+ * other containers like `<box>`, `<scroll>`, or `<zstack>`.
27
+ *
28
+ * Items are append-only: removing or modifying items won't update printed output.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * const [logs, setLogs] = useState<string[]>([])
33
+ *
34
+ * // Correct: Static at root level
35
+ * return (
36
+ * <>
37
+ * <Static items={logs}>
38
+ * {(log, i) => <text key={i}>{log}</text>}
39
+ * </Static>
40
+ * <text>Live status: {status}</text>
41
+ * </>
42
+ * )
43
+ * ```
44
+ */
45
+ export function Static<T>({ items, children }: StaticProps<T>) {
46
+ // Track how many items we've already "printed"
47
+ const [printedIndex, setPrintedIndex] = useState(0)
48
+
49
+ // Only render new items (items we haven't printed yet)
50
+ const newItems = useMemo(() => items.slice(printedIndex), [items, printedIndex])
51
+
52
+ // After rendering, mark all items as printed
53
+ // useLayoutEffect ensures this happens before paint, so items unmount quickly
54
+ useLayoutEffect(() => {
55
+ if (items.length > printedIndex) {
56
+ setPrintedIndex(items.length)
57
+ }
58
+ }, [items.length, printedIndex])
59
+
60
+ // If no new items, render nothing
61
+ if (newItems.length === 0) {
62
+ return null
63
+ }
64
+
65
+ // Render new items in a vstack with the __static marker
66
+ // The reconciler will detect this and handle it specially
67
+ return <vstack __static>{newItems.map((item, i) => children(item, printedIndex + i))}</vstack>
68
+ }
@@ -0,0 +1,356 @@
1
+ import { useState, useCallback, useEffect } from "react"
2
+ import { Colors, type Color, displayWidth } from "@effect-tui/core"
3
+ import { useKeyboard } from "../hooks/use-keyboard.js"
4
+ import type { DrawContext } from "../hosts/canvas.js"
5
+ import {
6
+ type TextState,
7
+ deleteWordBackward,
8
+ killToEnd,
9
+ killToStart,
10
+ deleteCharForward,
11
+ deleteCharBackward,
12
+ transposeChars,
13
+ insertText,
14
+ matchPrevWord,
15
+ matchNextWord,
16
+ } from "./text-editing.js"
17
+
18
+ export interface TextInputProps {
19
+ /** Current input value (controlled) */
20
+ value: string
21
+ /** Called when value changes */
22
+ onChange: (value: string) => void
23
+ /** Placeholder text shown when value is empty */
24
+ placeholder?: string
25
+ /** Width of the input (default: fill available) */
26
+ width?: number
27
+ /** Foreground color for text */
28
+ fg?: Color
29
+ /** Background color */
30
+ bg?: Color
31
+ /** Cursor foreground color (for block style) */
32
+ cursorFg?: Color
33
+ /** Cursor background color (for block style) or underline color (for underline style) */
34
+ cursorBg?: Color
35
+ /** Placeholder foreground color */
36
+ placeholderFg?: Color
37
+ /** Called when Enter is pressed */
38
+ onSubmit?: (value: string) => void
39
+ /** Called when Escape is pressed */
40
+ onCancel?: () => void
41
+ /** Whether the input is focused and accepts input */
42
+ focused?: boolean
43
+ /** Show cursor even when not focused */
44
+ showCursor?: boolean
45
+ /** Cursor style: block (inverted colors) or underline */
46
+ cursorStyle?: "block" | "underline"
47
+ }
48
+
49
+ /**
50
+ * A controlled text input component for terminal UIs.
51
+ *
52
+ * Features:
53
+ * - Arrow key navigation (Home/End for line start/end)
54
+ * - Word-by-word navigation with Option/Alt+Arrow
55
+ * - Backspace/Delete with word variants (Option+Backspace, Ctrl+W)
56
+ * - Emacs keybindings: Ctrl+A/E (start/end), Ctrl+B/F (back/forward char),
57
+ * Ctrl+H/D (delete back/forward char), Ctrl+K/U (kill to end/start),
58
+ * Ctrl+W (delete word back), Ctrl+T (transpose), Ctrl+Y (yank)
59
+ * - Kill ring for Ctrl+Y (yank last killed text)
60
+ *
61
+ * @example
62
+ * ```tsx
63
+ * const [text, setText] = useState("")
64
+ * <TextInput
65
+ * value={text}
66
+ * onChange={setText}
67
+ * placeholder="Type here..."
68
+ * />
69
+ * ```
70
+ */
71
+ export function TextInput({
72
+ value,
73
+ onChange,
74
+ placeholder = "",
75
+ width,
76
+ fg = Colors.brightWhite,
77
+ bg,
78
+ cursorFg = Colors.black,
79
+ cursorBg = Colors.brightWhite,
80
+ placeholderFg = Colors.gray(10),
81
+ onSubmit,
82
+ onCancel,
83
+ focused = true,
84
+ showCursor = true,
85
+ cursorStyle = "block",
86
+ }: TextInputProps) {
87
+ const [cursorPos, setCursorPos] = useState(value.length)
88
+ const [killRing, setKillRing] = useState("")
89
+ const [scrollOffset, setScrollOffset] = useState(0)
90
+
91
+ // Keep cursor in bounds when value changes externally
92
+ useEffect(() => {
93
+ if (cursorPos > value.length) {
94
+ setCursorPos(value.length)
95
+ }
96
+ }, [value, cursorPos])
97
+
98
+ const handleKey = useCallback(
99
+ (key: { name: string; text?: string; ctrl?: boolean; meta?: boolean; shift?: boolean }) => {
100
+ if (!focused) return
101
+
102
+ const state: TextState = { text: value, cursor: cursorPos, killRing }
103
+
104
+ // Helper to apply an edit result
105
+ const applyEdit = (result: { state: TextState; changed: boolean }) => {
106
+ if (result.changed) {
107
+ onChange(result.state.text)
108
+ setCursorPos(result.state.cursor)
109
+ if (result.state.killRing !== killRing) {
110
+ setKillRing(result.state.killRing)
111
+ }
112
+ }
113
+ }
114
+
115
+ // Helper for word boundary movement
116
+ const moveToPrevWord = () => {
117
+ const beforeCursor = value.slice(0, cursorPos)
118
+ const match = matchPrevWord(beforeCursor)
119
+ setCursorPos(match ? cursorPos - match.length : 0)
120
+ }
121
+
122
+ const moveToNextWord = () => {
123
+ const afterCursor = value.slice(cursorPos)
124
+ const match = matchNextWord(afterCursor)
125
+ setCursorPos(match ? cursorPos + match.length : value.length)
126
+ }
127
+
128
+ switch (key.name) {
129
+ case "left":
130
+ if (key.meta) {
131
+ moveToPrevWord()
132
+ } else {
133
+ setCursorPos(Math.max(0, cursorPos - 1))
134
+ }
135
+ break
136
+
137
+ case "right":
138
+ if (key.meta) {
139
+ moveToNextWord()
140
+ } else {
141
+ setCursorPos(Math.min(value.length, cursorPos + 1))
142
+ }
143
+ break
144
+
145
+ case "home":
146
+ setCursorPos(0)
147
+ break
148
+
149
+ case "end":
150
+ setCursorPos(value.length)
151
+ break
152
+
153
+ case "backspace":
154
+ if (key.meta) {
155
+ // Option+Backspace: Delete to previous word boundary
156
+ const beforeCursor = value.slice(0, cursorPos)
157
+ const match = matchPrevWord(beforeCursor)
158
+ if (match) {
159
+ const newPos = cursorPos - match.length
160
+ onChange(value.slice(0, newPos) + value.slice(cursorPos))
161
+ setCursorPos(newPos)
162
+ } else if (cursorPos > 0) {
163
+ onChange(value.slice(cursorPos))
164
+ setCursorPos(0)
165
+ }
166
+ } else {
167
+ applyEdit(deleteCharBackward(state))
168
+ }
169
+ break
170
+
171
+ case "delete":
172
+ if (key.meta) {
173
+ // Option+Delete: Delete to next word boundary
174
+ const afterCursor = value.slice(cursorPos)
175
+ const match = matchNextWord(afterCursor)
176
+ if (match) {
177
+ onChange(value.slice(0, cursorPos) + value.slice(cursorPos + match.length))
178
+ } else if (cursorPos < value.length) {
179
+ onChange(value.slice(0, cursorPos))
180
+ }
181
+ } else {
182
+ applyEdit(deleteCharForward(state))
183
+ }
184
+ break
185
+
186
+ case "enter":
187
+ onSubmit?.(value)
188
+ break
189
+
190
+ case "escape":
191
+ onCancel?.()
192
+ break
193
+
194
+ case "char":
195
+ case "space":
196
+ if (key.ctrl && key.text) {
197
+ // Emacs-style keybindings
198
+ switch (key.text) {
199
+ case "a":
200
+ setCursorPos(0)
201
+ break
202
+ case "e":
203
+ setCursorPos(value.length)
204
+ break
205
+ case "b":
206
+ setCursorPos(Math.max(0, cursorPos - 1))
207
+ break
208
+ case "f":
209
+ setCursorPos(Math.min(value.length, cursorPos + 1))
210
+ break
211
+ case "d":
212
+ applyEdit(deleteCharForward(state))
213
+ break
214
+ case "h":
215
+ applyEdit(deleteCharBackward(state))
216
+ break
217
+ case "k":
218
+ applyEdit(killToEnd(state))
219
+ break
220
+ case "u":
221
+ applyEdit(killToStart(state))
222
+ break
223
+ case "w":
224
+ applyEdit(deleteWordBackward(state))
225
+ break
226
+ case "t":
227
+ applyEdit(transposeChars(state))
228
+ break
229
+ case "y":
230
+ applyEdit(insertText(state, killRing))
231
+ break
232
+ }
233
+ } else if (key.text && !key.meta) {
234
+ applyEdit(insertText(state, key.text))
235
+ }
236
+ break
237
+ }
238
+ },
239
+ [value, cursorPos, focused, onChange, onSubmit, onCancel, killRing],
240
+ )
241
+
242
+ useKeyboard(handleKey, { phase: "any" })
243
+
244
+ const draw = useCallback(
245
+ (ctx: DrawContext) => {
246
+ const displayText = value || placeholder
247
+ const isPlaceholder = !value
248
+ const textColor = isPlaceholder ? placeholderFg : fg
249
+ const maxLen = width ?? ctx.width
250
+
251
+ // Clear the line with background color
252
+ if (bg !== undefined) {
253
+ ctx.fill(0, 0, ctx.width, 1, " ", { bg })
254
+ }
255
+
256
+ // Calculate scroll offset to keep cursor visible
257
+ let effectiveScrollOffset = scrollOffset
258
+
259
+ // Compute character positions (for variable-width chars)
260
+ const charPositions: number[] = []
261
+ let totalWidth = 0
262
+ for (let i = 0; i < value.length; i++) {
263
+ charPositions.push(totalWidth)
264
+ totalWidth += displayWidth(value[i])
265
+ }
266
+ charPositions.push(totalWidth) // Position after last char (for cursor at end)
267
+
268
+ if (!isPlaceholder) {
269
+ const cursorX = charPositions[cursorPos] ?? totalWidth
270
+
271
+ // Scroll right if cursor is past visible area
272
+ if (cursorX >= effectiveScrollOffset + maxLen) {
273
+ effectiveScrollOffset = cursorX - maxLen + 1
274
+ }
275
+ // Scroll left if cursor is before visible area
276
+ if (cursorX < effectiveScrollOffset) {
277
+ effectiveScrollOffset = cursorX
278
+ }
279
+
280
+ // Update scroll state if changed
281
+ if (effectiveScrollOffset !== scrollOffset) {
282
+ setScrollOffset(effectiveScrollOffset)
283
+ }
284
+ } else {
285
+ effectiveScrollOffset = 0
286
+ }
287
+
288
+ // Draw text starting from scroll offset
289
+ let x = 0
290
+ for (let i = 0; i < displayText.length && x < maxLen; i++) {
291
+ const ch = displayText[i]
292
+ const charWidth = displayWidth(ch)
293
+ const charX = isPlaceholder ? x : charPositions[i] - effectiveScrollOffset
294
+
295
+ // Skip characters before visible area
296
+ if (!isPlaceholder && charPositions[i] + charWidth <= effectiveScrollOffset) {
297
+ continue
298
+ }
299
+ // Stop if we're past the visible area
300
+ if (charX >= maxLen) break
301
+
302
+ // Draw cursor at cursor position when focused
303
+ const isCursor = !isPlaceholder && i === cursorPos && focused && showCursor
304
+ if (isCursor) {
305
+ if (cursorStyle === "underline") {
306
+ ctx.text(charX, 0, ch, { fg: cursorBg, bg, underline: true })
307
+ } else {
308
+ ctx.text(charX, 0, ch, { fg: cursorFg, bg: cursorBg })
309
+ }
310
+ } else {
311
+ ctx.text(charX, 0, ch, { fg: textColor, bg })
312
+ }
313
+
314
+ x = charX + charWidth
315
+ }
316
+
317
+ // Draw cursor at end if cursor is at end of text
318
+ if (!isPlaceholder && cursorPos >= value.length && focused && showCursor) {
319
+ const cursorX = (charPositions[cursorPos] ?? totalWidth) - effectiveScrollOffset
320
+ if (cursorX >= 0 && cursorX < maxLen) {
321
+ if (cursorStyle === "underline") {
322
+ ctx.text(cursorX, 0, "_", { fg: cursorBg, bg })
323
+ } else {
324
+ ctx.text(cursorX, 0, " ", { fg: cursorFg, bg: cursorBg })
325
+ }
326
+ }
327
+ }
328
+
329
+ // If placeholder and focused, show cursor at start
330
+ if (isPlaceholder && focused && showCursor) {
331
+ if (cursorStyle === "underline") {
332
+ ctx.text(0, 0, placeholder[0] || "_", { fg: cursorBg, bg, underline: placeholder.length > 0 })
333
+ } else {
334
+ ctx.text(0, 0, placeholder[0] || " ", { fg: cursorFg, bg: cursorBg })
335
+ }
336
+ }
337
+ },
338
+ [
339
+ value,
340
+ placeholder,
341
+ cursorPos,
342
+ focused,
343
+ showCursor,
344
+ fg,
345
+ bg,
346
+ cursorFg,
347
+ cursorBg,
348
+ placeholderFg,
349
+ width,
350
+ cursorStyle,
351
+ scrollOffset,
352
+ ],
353
+ )
354
+
355
+ return <canvas draw={draw} width={width} height={1} />
356
+ }
@@ -0,0 +1,6 @@
1
+ export { TextInput, type TextInputProps } from "./TextInput.js"
2
+ export { MultilineTextInput, type MultilineTextInputProps } from "./MultilineTextInput.js"
3
+ export { Markdown, type MarkdownProps, type MarkdownTheme } from "./Markdown.js"
4
+ export { Static, type StaticProps } from "./Static.js"
5
+ export { Divider, type DividerProps } from "./Divider.js"
6
+ export { Overlay, type OverlayProps, type OverlayItemProps } from "./Overlay.js"