@effect-tui/react 0.1.3 → 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 +30 -23
  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 -94
  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,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,285 @@
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 */
32
+ cursorFg?: Color
33
+ /** Cursor background color */
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
+ }
46
+
47
+ /**
48
+ * A controlled text input component for terminal UIs.
49
+ *
50
+ * Features:
51
+ * - Arrow key navigation (Home/End for line start/end)
52
+ * - Word-by-word navigation with Option/Alt+Arrow
53
+ * - Backspace/Delete with word variants (Option+Backspace, Ctrl+W)
54
+ * - Emacs keybindings: Ctrl+A/E (start/end), Ctrl+B/F (back/forward char),
55
+ * Ctrl+H/D (delete back/forward char), Ctrl+K/U (kill to end/start),
56
+ * Ctrl+W (delete word back), Ctrl+T (transpose), Ctrl+Y (yank)
57
+ * - Kill ring for Ctrl+Y (yank last killed text)
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * const [text, setText] = useState("")
62
+ * <TextInput
63
+ * value={text}
64
+ * onChange={setText}
65
+ * placeholder="Type here..."
66
+ * />
67
+ * ```
68
+ */
69
+ export function TextInput({
70
+ value,
71
+ onChange,
72
+ placeholder = "",
73
+ width,
74
+ fg = Colors.brightWhite,
75
+ bg,
76
+ cursorFg = Colors.black,
77
+ cursorBg = Colors.brightWhite,
78
+ placeholderFg = Colors.gray(10),
79
+ onSubmit,
80
+ onCancel,
81
+ focused = true,
82
+ showCursor = true,
83
+ }: TextInputProps) {
84
+ const [cursorPos, setCursorPos] = useState(value.length)
85
+ const [killRing, setKillRing] = useState("")
86
+
87
+ // Keep cursor in bounds when value changes externally
88
+ useEffect(() => {
89
+ if (cursorPos > value.length) {
90
+ setCursorPos(value.length)
91
+ }
92
+ }, [value, cursorPos])
93
+
94
+ const handleKey = useCallback(
95
+ (key: { name: string; text?: string; ctrl?: boolean; meta?: boolean; shift?: boolean }) => {
96
+ if (!focused) return
97
+
98
+ const state: TextState = { text: value, cursor: cursorPos, killRing }
99
+
100
+ // Helper to apply an edit result
101
+ const applyEdit = (result: { state: TextState; changed: boolean }) => {
102
+ if (result.changed) {
103
+ onChange(result.state.text)
104
+ setCursorPos(result.state.cursor)
105
+ if (result.state.killRing !== killRing) {
106
+ setKillRing(result.state.killRing)
107
+ }
108
+ }
109
+ }
110
+
111
+ // Helper for word boundary movement
112
+ const moveToPrevWord = () => {
113
+ const beforeCursor = value.slice(0, cursorPos)
114
+ const match = matchPrevWord(beforeCursor)
115
+ setCursorPos(match ? cursorPos - match.length : 0)
116
+ }
117
+
118
+ const moveToNextWord = () => {
119
+ const afterCursor = value.slice(cursorPos)
120
+ const match = matchNextWord(afterCursor)
121
+ setCursorPos(match ? cursorPos + match.length : value.length)
122
+ }
123
+
124
+ switch (key.name) {
125
+ case "left":
126
+ if (key.meta) {
127
+ moveToPrevWord()
128
+ } else {
129
+ setCursorPos(Math.max(0, cursorPos - 1))
130
+ }
131
+ break
132
+
133
+ case "right":
134
+ if (key.meta) {
135
+ moveToNextWord()
136
+ } else {
137
+ setCursorPos(Math.min(value.length, cursorPos + 1))
138
+ }
139
+ break
140
+
141
+ case "home":
142
+ setCursorPos(0)
143
+ break
144
+
145
+ case "end":
146
+ setCursorPos(value.length)
147
+ break
148
+
149
+ case "backspace":
150
+ if (key.meta) {
151
+ // Option+Backspace: Delete to previous word boundary
152
+ const beforeCursor = value.slice(0, cursorPos)
153
+ const match = matchPrevWord(beforeCursor)
154
+ if (match) {
155
+ const newPos = cursorPos - match.length
156
+ onChange(value.slice(0, newPos) + value.slice(cursorPos))
157
+ setCursorPos(newPos)
158
+ } else if (cursorPos > 0) {
159
+ onChange(value.slice(cursorPos))
160
+ setCursorPos(0)
161
+ }
162
+ } else {
163
+ applyEdit(deleteCharBackward(state))
164
+ }
165
+ break
166
+
167
+ case "delete":
168
+ if (key.meta) {
169
+ // Option+Delete: Delete to next word boundary
170
+ const afterCursor = value.slice(cursorPos)
171
+ const match = matchNextWord(afterCursor)
172
+ if (match) {
173
+ onChange(value.slice(0, cursorPos) + value.slice(cursorPos + match.length))
174
+ } else if (cursorPos < value.length) {
175
+ onChange(value.slice(0, cursorPos))
176
+ }
177
+ } else {
178
+ applyEdit(deleteCharForward(state))
179
+ }
180
+ break
181
+
182
+ case "enter":
183
+ onSubmit?.(value)
184
+ break
185
+
186
+ case "escape":
187
+ onCancel?.()
188
+ break
189
+
190
+ case "char":
191
+ case "space":
192
+ if (key.ctrl && key.text) {
193
+ // Emacs-style keybindings
194
+ switch (key.text) {
195
+ case "a":
196
+ setCursorPos(0)
197
+ break
198
+ case "e":
199
+ setCursorPos(value.length)
200
+ break
201
+ case "b":
202
+ setCursorPos(Math.max(0, cursorPos - 1))
203
+ break
204
+ case "f":
205
+ setCursorPos(Math.min(value.length, cursorPos + 1))
206
+ break
207
+ case "d":
208
+ applyEdit(deleteCharForward(state))
209
+ break
210
+ case "h":
211
+ applyEdit(deleteCharBackward(state))
212
+ break
213
+ case "k":
214
+ applyEdit(killToEnd(state))
215
+ break
216
+ case "u":
217
+ applyEdit(killToStart(state))
218
+ break
219
+ case "w":
220
+ applyEdit(deleteWordBackward(state))
221
+ break
222
+ case "t":
223
+ applyEdit(transposeChars(state))
224
+ break
225
+ case "y":
226
+ applyEdit(insertText(state, killRing))
227
+ break
228
+ }
229
+ } else if (key.text && !key.meta) {
230
+ applyEdit(insertText(state, key.text))
231
+ }
232
+ break
233
+ }
234
+ },
235
+ [value, cursorPos, focused, onChange, onSubmit, onCancel, killRing],
236
+ )
237
+
238
+ useKeyboard(handleKey, { phase: "any" })
239
+
240
+ const draw = useCallback(
241
+ (ctx: DrawContext) => {
242
+ const displayText = value || placeholder
243
+ const isPlaceholder = !value
244
+ const textColor = isPlaceholder ? placeholderFg : fg
245
+
246
+ // Clear the line with background color
247
+ if (bg !== undefined) {
248
+ ctx.fill(0, 0, ctx.width, 1, " ", { bg })
249
+ }
250
+
251
+ // Draw text up to width
252
+ const maxLen = width ?? ctx.width
253
+ let x = 0
254
+ for (let i = 0; i < displayText.length && x < maxLen; i++) {
255
+ const ch = displayText[i]
256
+ const charWidth = displayWidth(ch)
257
+
258
+ if (x + charWidth > maxLen) break
259
+
260
+ // Draw cursor (inverted) at cursor position when focused
261
+ const isCursor = !isPlaceholder && i === cursorPos && focused && showCursor
262
+ if (isCursor) {
263
+ ctx.text(x, 0, ch, { fg: cursorFg, bg: cursorBg })
264
+ } else {
265
+ ctx.text(x, 0, ch, { fg: textColor, bg })
266
+ }
267
+
268
+ x += charWidth
269
+ }
270
+
271
+ // Draw cursor at end if cursor is at end of text
272
+ if (!isPlaceholder && cursorPos >= value.length && focused && showCursor && x < maxLen) {
273
+ ctx.text(x, 0, " ", { fg: cursorFg, bg: cursorBg })
274
+ }
275
+
276
+ // If placeholder and focused, show cursor at start
277
+ if (isPlaceholder && focused && showCursor) {
278
+ ctx.text(0, 0, placeholder[0] || " ", { fg: cursorFg, bg: cursorBg })
279
+ }
280
+ },
281
+ [value, placeholder, cursorPos, focused, showCursor, fg, bg, cursorFg, cursorBg, placeholderFg, width],
282
+ )
283
+
284
+ return <canvas draw={draw} width={width} height={1} />
285
+ }
@@ -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"