@effect-tui/react 0.15.2 → 0.16.0

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 (249) hide show
  1. package/README.md +2 -2
  2. package/dist/src/components/ListView.d.ts +4 -4
  3. package/dist/src/components/ListView.d.ts.map +1 -1
  4. package/dist/src/components/ListView.js +16 -17
  5. package/dist/src/components/ListView.js.map +1 -1
  6. package/dist/src/console/ConsolePopover.d.ts +7 -1
  7. package/dist/src/console/ConsolePopover.d.ts.map +1 -1
  8. package/dist/src/console/ConsolePopover.js +55 -74
  9. package/dist/src/console/ConsolePopover.js.map +1 -1
  10. package/dist/src/debug/DebugOverlay.d.ts.map +1 -1
  11. package/dist/src/debug/DebugOverlay.js +3 -57
  12. package/dist/src/debug/DebugOverlay.js.map +1 -1
  13. package/dist/src/debug/DiagnosticsPanel.js +1 -1
  14. package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
  15. package/dist/src/dev.d.ts +5 -117
  16. package/dist/src/dev.d.ts.map +1 -1
  17. package/dist/src/dev.js +3 -333
  18. package/dist/src/dev.js.map +1 -1
  19. package/dist/src/hooks/use-scroll.d.ts +31 -35
  20. package/dist/src/hooks/use-scroll.d.ts.map +1 -1
  21. package/dist/src/hooks/use-scroll.js +51 -90
  22. package/dist/src/hooks/use-scroll.js.map +1 -1
  23. package/dist/src/hosts/canvas.d.ts +2 -2
  24. package/dist/src/hosts/canvas.d.ts.map +1 -1
  25. package/dist/src/hosts/canvas.js +8 -10
  26. package/dist/src/hosts/canvas.js.map +1 -1
  27. package/dist/src/hosts/codeblock.d.ts +2 -2
  28. package/dist/src/hosts/codeblock.js +2 -2
  29. package/dist/src/hosts/flex-container.d.ts +1 -1
  30. package/dist/src/hosts/flex-container.d.ts.map +1 -1
  31. package/dist/src/hosts/flex-container.js +3 -3
  32. package/dist/src/hosts/flex-container.js.map +1 -1
  33. package/dist/src/hosts/index.d.ts +2 -1
  34. package/dist/src/hosts/index.d.ts.map +1 -1
  35. package/dist/src/hosts/index.js +2 -1
  36. package/dist/src/hosts/index.js.map +1 -1
  37. package/dist/src/hosts/layout-helpers.d.ts +10 -0
  38. package/dist/src/hosts/layout-helpers.d.ts.map +1 -0
  39. package/dist/src/hosts/layout-helpers.js +10 -0
  40. package/dist/src/hosts/layout-helpers.js.map +1 -0
  41. package/dist/src/hosts/leaf.d.ts +14 -0
  42. package/dist/src/hosts/leaf.d.ts.map +1 -0
  43. package/dist/src/hosts/leaf.js +31 -0
  44. package/dist/src/hosts/leaf.js.map +1 -0
  45. package/dist/src/hosts/overlay.d.ts.map +1 -1
  46. package/dist/src/hosts/overlay.js +4 -7
  47. package/dist/src/hosts/overlay.js.map +1 -1
  48. package/dist/src/hosts/scroll.d.ts +47 -24
  49. package/dist/src/hosts/scroll.d.ts.map +1 -1
  50. package/dist/src/hosts/scroll.js +68 -51
  51. package/dist/src/hosts/scroll.js.map +1 -1
  52. package/dist/src/hosts/spacer.d.ts +2 -2
  53. package/dist/src/hosts/spacer.js +2 -2
  54. package/dist/src/hosts/text.d.ts +2 -3
  55. package/dist/src/hosts/text.d.ts.map +1 -1
  56. package/dist/src/hosts/text.js +5 -61
  57. package/dist/src/hosts/text.js.map +1 -1
  58. package/dist/src/hosts/vstack.js +1 -1
  59. package/dist/src/hosts/vstack.js.map +1 -1
  60. package/dist/src/hosts/zstack.d.ts +1 -1
  61. package/dist/src/hosts/zstack.d.ts.map +1 -1
  62. package/dist/src/hosts/zstack.js +6 -6
  63. package/dist/src/hosts/zstack.js.map +1 -1
  64. package/dist/src/index.d.ts +1 -1
  65. package/dist/src/index.d.ts.map +1 -1
  66. package/dist/src/internal/dev/hmr.d.ts +20 -0
  67. package/dist/src/internal/dev/hmr.d.ts.map +1 -0
  68. package/dist/src/internal/dev/hmr.js +93 -0
  69. package/dist/src/internal/dev/hmr.js.map +1 -0
  70. package/dist/src/internal/dev/runtime.d.ts +24 -0
  71. package/dist/src/internal/dev/runtime.d.ts.map +1 -0
  72. package/dist/src/internal/dev/runtime.js +135 -0
  73. package/dist/src/internal/dev/runtime.js.map +1 -0
  74. package/dist/src/internal/dev/ui.d.ts +13 -0
  75. package/dist/src/internal/dev/ui.d.ts.map +1 -0
  76. package/dist/src/internal/dev/ui.js +51 -0
  77. package/dist/src/internal/dev/ui.js.map +1 -0
  78. package/dist/src/internal/renderer/context.d.ts +9 -0
  79. package/dist/src/internal/renderer/context.d.ts.map +1 -0
  80. package/dist/src/internal/renderer/context.js +22 -0
  81. package/dist/src/internal/renderer/context.js.map +1 -0
  82. package/dist/src/internal/renderer/core/FrameBuilder.d.ts +18 -0
  83. package/dist/src/internal/renderer/core/FrameBuilder.d.ts.map +1 -0
  84. package/dist/src/internal/renderer/core/FrameBuilder.js +40 -0
  85. package/dist/src/internal/renderer/core/FrameBuilder.js.map +1 -0
  86. package/dist/src/internal/renderer/core/RendererState.d.ts +41 -0
  87. package/dist/src/internal/renderer/core/RendererState.d.ts.map +1 -0
  88. package/dist/src/internal/renderer/core/RendererState.js +70 -0
  89. package/dist/src/internal/renderer/core/RendererState.js.map +1 -0
  90. package/dist/src/internal/renderer/core/index.d.ts +3 -0
  91. package/dist/src/internal/renderer/core/index.d.ts.map +1 -0
  92. package/dist/src/internal/renderer/core/index.js +3 -0
  93. package/dist/src/internal/renderer/core/index.js.map +1 -0
  94. package/dist/src/internal/renderer/index.d.ts +40 -0
  95. package/dist/src/internal/renderer/index.d.ts.map +1 -0
  96. package/dist/src/internal/renderer/index.js +518 -0
  97. package/dist/src/internal/renderer/index.js.map +1 -0
  98. package/dist/src/internal/renderer/input/InputProcessor.d.ts +30 -0
  99. package/dist/src/internal/renderer/input/InputProcessor.d.ts.map +1 -0
  100. package/dist/src/internal/renderer/input/InputProcessor.js +122 -0
  101. package/dist/src/internal/renderer/input/InputProcessor.js.map +1 -0
  102. package/dist/src/internal/renderer/input/index.d.ts +2 -0
  103. package/dist/src/internal/renderer/input/index.d.ts.map +1 -0
  104. package/dist/src/internal/renderer/input/index.js +2 -0
  105. package/dist/src/internal/renderer/input/index.js.map +1 -0
  106. package/dist/src/internal/renderer/lifecycle/EventBus.d.ts +42 -0
  107. package/dist/src/internal/renderer/lifecycle/EventBus.d.ts.map +1 -0
  108. package/dist/src/internal/renderer/lifecycle/EventBus.js +97 -0
  109. package/dist/src/internal/renderer/lifecycle/EventBus.js.map +1 -0
  110. package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts +13 -0
  111. package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts.map +1 -0
  112. package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js +111 -0
  113. package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js.map +1 -0
  114. package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts +3 -0
  115. package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts.map +1 -0
  116. package/dist/src/internal/renderer/lifecycle/RenderCache.js +9 -0
  117. package/dist/src/internal/renderer/lifecycle/RenderCache.js.map +1 -0
  118. package/dist/src/internal/renderer/lifecycle/index.d.ts +4 -0
  119. package/dist/src/internal/renderer/lifecycle/index.d.ts.map +1 -0
  120. package/dist/src/internal/renderer/lifecycle/index.js +4 -0
  121. package/dist/src/internal/renderer/lifecycle/index.js.map +1 -0
  122. package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts +12 -0
  123. package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
  124. package/dist/src/internal/renderer/modes/FullscreenRenderer.js +54 -0
  125. package/dist/src/internal/renderer/modes/FullscreenRenderer.js.map +1 -0
  126. package/dist/src/internal/renderer/modes/InlineRenderer.d.ts +25 -0
  127. package/dist/src/internal/renderer/modes/InlineRenderer.d.ts.map +1 -0
  128. package/dist/src/internal/renderer/modes/InlineRenderer.js +166 -0
  129. package/dist/src/internal/renderer/modes/InlineRenderer.js.map +1 -0
  130. package/dist/src/internal/renderer/modes/RendererMode.d.ts +42 -0
  131. package/dist/src/internal/renderer/modes/RendererMode.d.ts.map +1 -0
  132. package/dist/src/internal/renderer/modes/RendererMode.js +2 -0
  133. package/dist/src/internal/renderer/modes/RendererMode.js.map +1 -0
  134. package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts +25 -0
  135. package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
  136. package/dist/src/internal/renderer/modes/StaticContentRenderer.js +49 -0
  137. package/dist/src/internal/renderer/modes/StaticContentRenderer.js.map +1 -0
  138. package/dist/src/internal/renderer/modes/index.d.ts +5 -0
  139. package/dist/src/internal/renderer/modes/index.d.ts.map +1 -0
  140. package/dist/src/internal/renderer/modes/index.js +4 -0
  141. package/dist/src/internal/renderer/modes/index.js.map +1 -0
  142. package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts +13 -0
  143. package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts.map +1 -0
  144. package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js +75 -0
  145. package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js.map +1 -0
  146. package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts +29 -0
  147. package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts.map +1 -0
  148. package/dist/src/internal/renderer/terminal/TerminalSetup.js +82 -0
  149. package/dist/src/internal/renderer/terminal/TerminalSetup.js.map +1 -0
  150. package/dist/src/internal/renderer/terminal/index.d.ts +3 -0
  151. package/dist/src/internal/renderer/terminal/index.d.ts.map +1 -0
  152. package/dist/src/internal/renderer/terminal/index.js +3 -0
  153. package/dist/src/internal/renderer/terminal/index.js.map +1 -0
  154. package/dist/src/internal/renderer/types.d.ts +118 -0
  155. package/dist/src/internal/renderer/types.d.ts.map +1 -0
  156. package/dist/src/internal/renderer/types.js +2 -0
  157. package/dist/src/internal/renderer/types.js.map +1 -0
  158. package/dist/src/renderer-context.d.ts +1 -8
  159. package/dist/src/renderer-context.d.ts.map +1 -1
  160. package/dist/src/renderer-context.js +1 -21
  161. package/dist/src/renderer-context.js.map +1 -1
  162. package/dist/src/renderer-types.d.ts +1 -115
  163. package/dist/src/renderer-types.d.ts.map +1 -1
  164. package/dist/src/renderer.d.ts +1 -31
  165. package/dist/src/renderer.d.ts.map +1 -1
  166. package/dist/src/renderer.js +1 -495
  167. package/dist/src/renderer.js.map +1 -1
  168. package/dist/src/test/render-tui.d.ts +3 -3
  169. package/dist/src/test/render-tui.d.ts.map +1 -1
  170. package/dist/src/test/render-tui.js +16 -9
  171. package/dist/src/test/render-tui.js.map +1 -1
  172. package/dist/src/utils/alignment.d.ts +1 -1
  173. package/dist/src/utils/alignment.d.ts.map +1 -1
  174. package/dist/src/utils/alignment.js +0 -2
  175. package/dist/src/utils/alignment.js.map +1 -1
  176. package/dist/src/utils/console-helpers.d.ts +19 -0
  177. package/dist/src/utils/console-helpers.d.ts.map +1 -0
  178. package/dist/src/utils/console-helpers.js +61 -0
  179. package/dist/src/utils/console-helpers.js.map +1 -0
  180. package/dist/src/utils/index.d.ts +1 -1
  181. package/dist/src/utils/index.d.ts.map +1 -1
  182. package/dist/src/utils/index.js +1 -1
  183. package/dist/src/utils/index.js.map +1 -1
  184. package/dist/src/utils/styles.d.ts +8 -1
  185. package/dist/src/utils/styles.d.ts.map +1 -1
  186. package/dist/src/utils/styles.js +10 -8
  187. package/dist/src/utils/styles.js.map +1 -1
  188. package/dist/src/utils/text-wrap.d.ts +5 -0
  189. package/dist/src/utils/text-wrap.d.ts.map +1 -1
  190. package/dist/src/utils/text-wrap.js +110 -48
  191. package/dist/src/utils/text-wrap.js.map +1 -1
  192. package/dist/src/visualize/index.js +1 -1
  193. package/dist/src/visualize/index.js.map +1 -1
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/package.json +2 -2
  196. package/src/components/ListView.tsx +21 -23
  197. package/src/console/ConsolePopover.tsx +124 -107
  198. package/src/debug/DebugOverlay.ts +15 -74
  199. package/src/debug/DiagnosticsPanel.tsx +1 -1
  200. package/src/dev.tsx +5 -458
  201. package/src/hooks/use-scroll.ts +85 -145
  202. package/src/hosts/canvas.ts +8 -11
  203. package/src/hosts/codeblock.ts +2 -2
  204. package/src/hosts/flex-container.ts +4 -4
  205. package/src/hosts/index.ts +10 -1
  206. package/src/hosts/layout-helpers.ts +20 -0
  207. package/src/hosts/leaf.ts +36 -0
  208. package/src/hosts/overlay.ts +11 -9
  209. package/src/hosts/scroll.ts +94 -69
  210. package/src/hosts/spacer.ts +2 -2
  211. package/src/hosts/text.ts +5 -58
  212. package/src/hosts/vstack.ts +1 -1
  213. package/src/hosts/zstack.ts +7 -7
  214. package/src/index.ts +1 -1
  215. package/src/internal/dev/hmr.ts +101 -0
  216. package/src/internal/dev/runtime.ts +170 -0
  217. package/src/internal/dev/ui.tsx +87 -0
  218. package/src/internal/renderer/context.ts +27 -0
  219. package/src/{renderer → internal/renderer}/core/FrameBuilder.ts +2 -2
  220. package/src/internal/renderer/index.ts +656 -0
  221. package/src/{renderer → internal/renderer}/input/InputProcessor.ts +10 -1
  222. package/src/{renderer → internal/renderer}/lifecycle/EventBus.ts +9 -1
  223. package/src/internal/renderer/lifecycle/ProcessLifecycle.ts +125 -0
  224. package/src/internal/renderer/lifecycle/index.ts +3 -0
  225. package/src/{renderer → internal/renderer}/modes/InlineRenderer.ts +5 -2
  226. package/src/{renderer → internal/renderer}/modes/RendererMode.ts +1 -1
  227. package/src/{renderer → internal/renderer}/modes/StaticContentRenderer.ts +5 -2
  228. package/src/internal/renderer/terminal/KeyboardCapabilityProbe.ts +91 -0
  229. package/src/{renderer/lifecycle → internal/renderer/terminal}/TerminalSetup.ts +4 -22
  230. package/src/internal/renderer/terminal/index.ts +2 -0
  231. package/src/internal/renderer/types.ts +125 -0
  232. package/src/renderer-context.ts +1 -27
  233. package/src/renderer-types.ts +10 -123
  234. package/src/renderer.ts +1 -619
  235. package/src/test/render-tui.ts +16 -10
  236. package/src/utils/alignment.ts +1 -3
  237. package/src/utils/console-helpers.ts +86 -0
  238. package/src/utils/index.ts +1 -1
  239. package/src/utils/styles.ts +16 -4
  240. package/src/utils/text-wrap.ts +139 -48
  241. package/src/visualize/index.tsx +1 -1
  242. package/src/renderer/lifecycle/ResizeManager.ts +0 -65
  243. package/src/renderer/lifecycle/index.ts +0 -4
  244. /package/src/{renderer → internal/renderer}/core/RendererState.ts +0 -0
  245. /package/src/{renderer → internal/renderer}/core/index.ts +0 -0
  246. /package/src/{renderer → internal/renderer}/input/index.ts +0 -0
  247. /package/src/{renderer → internal/renderer}/lifecycle/RenderCache.ts +0 -0
  248. /package/src/{renderer → internal/renderer}/modes/FullscreenRenderer.ts +0 -0
  249. /package/src/{renderer → internal/renderer}/modes/index.ts +0 -0
@@ -0,0 +1,518 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import { fileURLToPath } from "node:url";
3
+ import { ANSI, bufferToString } from "@effect-tui/core";
4
+ import React, {} from "react";
5
+ import { createTerminalWriter, writeToTerminal } from "../../console/ConsoleCapture.js";
6
+ import { DEFAULT_FPS } from "../../constants.js";
7
+ import { requestExit } from "../../exit.js";
8
+ import * as Prof from "../../profiler.js";
9
+ import { flushSync, reconciler } from "../../reconciler/host-config.js";
10
+ // Extracted modules
11
+ import { FrameBuilder, RendererState } from "./core/index.js";
12
+ import { InputProcessor } from "./input/index.js";
13
+ import { EventBus, getRenderCache, registerProcessHandlers } from "./lifecycle/index.js";
14
+ import { createKeyboardCapabilityProbe, TerminalSetup } from "./terminal/index.js";
15
+ import { FullscreenRenderer, InlineRenderer, StaticContentRenderer } from "./modes/index.js";
16
+ import { RendererContext } from "./context.js";
17
+ import { startDevRuntime } from "../dev/runtime.js";
18
+ export { RendererContext, useRenderer, useTerminalSize } from "./context.js";
19
+ export function createRenderer(options) {
20
+ const fps = options?.fps ?? DEFAULT_FPS;
21
+ // Use custom stdout if provided, otherwise use process.stdout with bypassed capture
22
+ let stdout;
23
+ if (options?.stdout) {
24
+ // Use custom stdout as-is (e.g., for testing with MockStdout)
25
+ stdout = options.stdout;
26
+ }
27
+ else {
28
+ // Create a proxy that bypasses console capture for writes
29
+ // This ensures Effect.log etc. don't corrupt the TUI
30
+ const terminalWrite = createTerminalWriter();
31
+ stdout = new Proxy(process.stdout, {
32
+ get(target, prop) {
33
+ if (prop === "write") {
34
+ return terminalWrite;
35
+ }
36
+ const value = target[prop];
37
+ // Bind methods to preserve `this` context (critical for .on(), .removeListener(), etc.)
38
+ if (typeof value === "function") {
39
+ return value.bind(target);
40
+ }
41
+ return value;
42
+ },
43
+ });
44
+ }
45
+ const stdin = options?.stdin ?? process.stdin;
46
+ const mode = options?.mode ?? "fullscreen";
47
+ const exitOnCtrlC = options?.exitOnCtrlC ?? true;
48
+ const handleSignals = options?.handleSignals ?? true;
49
+ const exitOnSignal = options?.exitOnSignal ?? true;
50
+ const signalExitCodes = {
51
+ SIGINT: 130,
52
+ SIGTERM: 143,
53
+ ...options?.signalExitCodes,
54
+ };
55
+ const manualMode = options?.manualMode ?? false;
56
+ const enableDiff = options?.diff ?? !manualMode;
57
+ const skipTerminalSetup = options?.skipTerminalSetup ?? false;
58
+ const enablePaste = options?.enablePaste ?? true;
59
+ const enableMouse = options?.enableMouse ?? mode === "fullscreen";
60
+ const enableKittyKeyboard = options?.enableKittyKeyboard;
61
+ const debugHook = options?.debug?.onFrame;
62
+ const keyboardProbe = !skipTerminalSetup && enableKittyKeyboard !== false
63
+ ? createKeyboardCapabilityProbe({
64
+ stdout,
65
+ onResolved: (supportsKitty) => {
66
+ if (supportsKitty) {
67
+ stdout.write(ANSI.modifyOtherKeys.disable);
68
+ stdout.write(ANSI.keyboard.enable(1));
69
+ }
70
+ else {
71
+ stdout.write(ANSI.modifyOtherKeys.enable);
72
+ }
73
+ },
74
+ })
75
+ : null;
76
+ // Initialize state
77
+ const state = new RendererState(stdout.columns || 80, stdout.rows || 24);
78
+ const events = new EventBus();
79
+ const frameBuilder = new FrameBuilder();
80
+ // Terminal setup/teardown
81
+ const terminal = new TerminalSetup(stdout, stdin, {
82
+ mode,
83
+ enablePaste,
84
+ enableMouse,
85
+ skipTerminalSetup,
86
+ });
87
+ // Render mode (fullscreen or inline)
88
+ const renderMode = mode === "fullscreen" ? new FullscreenRenderer() : new InlineRenderer();
89
+ // Static content renderer (inline mode only)
90
+ const staticRenderer = mode === "inline" ? new StaticContentRenderer(stdout, state.palette) : null;
91
+ // Input processing
92
+ const inputProcessor = new InputProcessor({
93
+ exitOnCtrlC,
94
+ dispatchKey: (key) => {
95
+ events.dispatchKey(key);
96
+ return key.defaultPrevented ?? false;
97
+ },
98
+ dispatchMouse: (mouse) => events.dispatchMouse(mouse),
99
+ dispatchPaste: (text) => events.dispatchPaste(text),
100
+ flushSync: (fn) => flushSync(fn) ?? undefined,
101
+ onInputProcessed: () => {
102
+ if (!manualMode)
103
+ renderFrame();
104
+ },
105
+ onQuit: () => {
106
+ // Clean up terminal state before exiting
107
+ renderer.stop();
108
+ requestExit(0);
109
+ },
110
+ filterInput: keyboardProbe ? (input) => keyboardProbe.handleInput(input) : undefined,
111
+ });
112
+ const handleInlineFullRerender = () => {
113
+ if (mode !== "inline" || !staticRenderer)
114
+ return "";
115
+ const inlineMode = renderMode;
116
+ if (!inlineMode.needsFullRerender())
117
+ return "";
118
+ let output = "";
119
+ // Clear screen + scrollback + cursor home
120
+ output += ANSI.screen.clear + ANSI.screen.clearScrollback + ANSI.cursor.home;
121
+ // Replay all cached static content
122
+ const cachedStatic = staticRenderer.getCachedOutput();
123
+ if (cachedStatic) {
124
+ output += cachedStatic;
125
+ }
126
+ // Reset state
127
+ inlineMode.clearFullRerenderFlag();
128
+ state.invalidateBuffers();
129
+ return output;
130
+ };
131
+ const flushInlineStatic = (container, frameWidth) => {
132
+ if (mode !== "inline" || !container?.staticDirty || !container.staticRoot || !staticRenderer) {
133
+ return "";
134
+ }
135
+ const inlineMode = renderMode;
136
+ const prevHeight = inlineMode.getPreviousHeight();
137
+ let output = "";
138
+ // Step 1: Clear the dynamic area (move up + clear to end of screen)
139
+ if (prevHeight > 0) {
140
+ output += ANSI.cursor.up(prevHeight) + ANSI.cursor.startOfLine + ANSI.screen.clearToEnd;
141
+ }
142
+ // Step 2: Append static content (cursor ends at bottom of static)
143
+ output += staticRenderer.render(container.staticRoot, frameWidth);
144
+ // Step 3: Reset previousHeight to 0 (we cleared dynamic, starting fresh)
145
+ inlineMode.reset();
146
+ inlineMode.forceFullOutputOnce(); // Force full output to resync cursor tracking after static
147
+ state.invalidateBuffers();
148
+ container.staticDirty = false;
149
+ return output;
150
+ };
151
+ // The render frame logic
152
+ const renderFrame = () => {
153
+ const frameStart = Prof.startFrame();
154
+ const frameStartMs = performance.now();
155
+ // Flush any pending React updates before measuring/layout.
156
+ // Ensures resize-driven state (useTerminalSize) is reflected in the host tree.
157
+ flushSync(() => { });
158
+ const frameWidth = state.width;
159
+ const frameHeight = state.height;
160
+ let contentH = frameHeight;
161
+ const container = renderer._container;
162
+ const root = container?.root ?? null;
163
+ // Must render if dirty OR if static content needs flushing
164
+ if ((!state.dirty && !container?.staticDirty) || !root)
165
+ return;
166
+ state.dirty = false;
167
+ try {
168
+ // Handle full rerender on resize (Ink-style: clear everything + replay static)
169
+ const fullRerenderOutput = handleInlineFullRerender();
170
+ // Handle static content: clear dynamic area, append static, then fresh dynamic render
171
+ // Note: IL (insert lines) won't work here because inline mode uses relative positioning
172
+ // and IL would desync the screen state from our buffer tracking.
173
+ const staticOutput = flushInlineStatic(container ?? null, frameWidth);
174
+ // For inline mode, measure content unconstrained to handle overflow
175
+ let actualContentHeight = frameHeight;
176
+ if (mode === "inline") {
177
+ const size = root.measure(frameWidth, Number.MAX_SAFE_INTEGER);
178
+ actualContentHeight = size.h;
179
+ }
180
+ // Buffer height: content height for inline (to capture all content), terminal height for fullscreen
181
+ const bufferHeight = mode === "inline" ? Math.max(actualContentHeight, frameHeight) : frameHeight;
182
+ // Ensure buffers exist
183
+ state.ensureBuffers(frameWidth, bufferHeight);
184
+ if (!state.nextBuffer)
185
+ return;
186
+ // Build frame (clear, layout, render)
187
+ const timings = frameBuilder.build(root, state.nextBuffer, state.palette, frameWidth, bufferHeight);
188
+ // Generate output
189
+ const t = Prof.startPhase();
190
+ const diffStartMs = performance.now();
191
+ const { output: modeOutput, contentHeight } = renderMode.generateOutput({
192
+ nextBuffer: state.nextBuffer,
193
+ prevBuffer: state.prevBuffer,
194
+ palette: state.palette,
195
+ frameWidth,
196
+ frameHeight,
197
+ contentHeight: actualContentHeight,
198
+ enableDiff,
199
+ stdout,
200
+ });
201
+ // Combine all output for single atomic write
202
+ // fullRerenderOutput (clear + replay static) goes BEFORE sync block
203
+ // Sync block wraps only the dynamic content to prevent tearing
204
+ const output = fullRerenderOutput +
205
+ ANSI.sync.begin +
206
+ staticOutput +
207
+ modeOutput +
208
+ state.palette.sgr(0) +
209
+ ANSI.sync.end;
210
+ contentH = contentHeight;
211
+ const diffAnsiMs = performance.now() - diffStartMs;
212
+ Prof.endPhase("diff+ansi", t);
213
+ // Write output (single atomic write prevents visual glitches)
214
+ const writeT = Prof.startPhase();
215
+ const writeStart = performance.now();
216
+ stdout.write(output);
217
+ const writeMs = performance.now() - writeStart;
218
+ Prof.endPhase("write", writeT);
219
+ Prof.endFrame(frameStart);
220
+ const frameMs = performance.now() - frameStartMs;
221
+ // Swap buffers
222
+ state.swapBuffers();
223
+ // Build stats
224
+ const stats = {
225
+ mode,
226
+ width: state.width,
227
+ height: state.height,
228
+ contentHeight: contentH,
229
+ bytes: Buffer.byteLength(output, "utf8"),
230
+ frameMs,
231
+ phases: {
232
+ clear: timings.clear,
233
+ layout: timings.layout,
234
+ render: timings.render,
235
+ diffMs: diffAnsiMs,
236
+ write: writeMs,
237
+ },
238
+ timestamp: performance.now(),
239
+ };
240
+ if (debugHook)
241
+ debugHook(stats);
242
+ if (events.hasFrameHandlers)
243
+ events.dispatchFrame(stats);
244
+ }
245
+ catch (err) {
246
+ console.error("[effect-tui] Render error:", err);
247
+ state.markDirty();
248
+ }
249
+ };
250
+ const applyResize = (width, height, renderNow) => {
251
+ const prevWidth = state.lastWidth;
252
+ renderMode.handleResize(width, height, prevWidth);
253
+ state.updateDimensions(width, height);
254
+ state.invalidateBuffers();
255
+ state.markDirty();
256
+ flushSync(() => {
257
+ events.dispatchResize(width, height);
258
+ });
259
+ if (renderNow)
260
+ renderFrame();
261
+ };
262
+ let onExit = null;
263
+ let onSignal = null;
264
+ let onUncaughtException = null;
265
+ let onUnhandledRejection = null;
266
+ let unregisterProcessHandlers = null;
267
+ // Build renderer object
268
+ const renderer = {
269
+ get width() {
270
+ return state.width;
271
+ },
272
+ get height() {
273
+ return state.height;
274
+ },
275
+ requestRender() {
276
+ state.markDirty();
277
+ },
278
+ onKey: (handler) => events.onKey(handler),
279
+ onMouse: (handler) => events.onMouse(handler),
280
+ onPaste: (handler) => events.onPaste(handler),
281
+ onResize: (handler) => events.onResize(handler),
282
+ onFrameStats: (handler) => events.onFrameStats(handler),
283
+ stop() {
284
+ state.running = false;
285
+ if (unregisterProcessHandlers) {
286
+ unregisterProcessHandlers();
287
+ unregisterProcessHandlers = null;
288
+ onExit = null;
289
+ onSignal = null;
290
+ onUncaughtException = null;
291
+ onUnhandledRejection = null;
292
+ }
293
+ if (state.loop) {
294
+ clearInterval(state.loop);
295
+ state.loop = null;
296
+ }
297
+ if (state.inputHandler) {
298
+ stdin.removeListener("data", state.inputHandler);
299
+ state.inputHandler = null;
300
+ }
301
+ if (state.resizeHandler) {
302
+ stdout.removeListener("resize", state.resizeHandler);
303
+ state.resizeHandler = null;
304
+ }
305
+ events.clear();
306
+ terminal.teardown();
307
+ },
308
+ renderNow() {
309
+ renderFrame();
310
+ },
311
+ getScreenshot() {
312
+ // Return the previous buffer as ANSI string (it has the last rendered frame)
313
+ if (state.prevBuffer) {
314
+ return bufferToString(state.prevBuffer, state.palette, state.width, state.height);
315
+ }
316
+ return "";
317
+ },
318
+ dispatchKey(key) {
319
+ events.dispatchKey(key);
320
+ if (!manualMode)
321
+ renderFrame();
322
+ },
323
+ dispatchPaste(text) {
324
+ events.dispatchPaste(text);
325
+ if (!manualMode)
326
+ renderFrame();
327
+ },
328
+ dispatchResize(width, height) {
329
+ applyResize(width, height, !manualMode);
330
+ },
331
+ };
332
+ // Terminal setup
333
+ terminal.setup();
334
+ keyboardProbe?.start();
335
+ if (!keyboardProbe && !skipTerminalSetup) {
336
+ stdout.write(ANSI.modifyOtherKeys.enable);
337
+ }
338
+ // Input handling
339
+ state.inputHandler = (data) => inputProcessor.process(data);
340
+ stdin.on("data", state.inputHandler);
341
+ // Resize handling
342
+ state.resizeHandler = () => {
343
+ const newWidth = stdout.columns || 80;
344
+ const newHeight = stdout.rows || 24;
345
+ applyResize(newWidth, newHeight, false);
346
+ };
347
+ stdout.on("resize", state.resizeHandler);
348
+ // Render loop
349
+ if (!manualMode) {
350
+ const frameMs = 1000 / fps;
351
+ state.loop = setInterval(() => {
352
+ if (!state.running) {
353
+ if (state.loop)
354
+ clearInterval(state.loop);
355
+ terminal.teardown();
356
+ return;
357
+ }
358
+ renderFrame();
359
+ }, frameMs);
360
+ }
361
+ // Process exit handlers - ensure terminal is restored on any exit
362
+ // These handlers are critical for proper cleanup when process.exit() is called
363
+ let cleanedUp = false;
364
+ const cleanup = () => {
365
+ if (cleanedUp)
366
+ return;
367
+ cleanedUp = true;
368
+ renderer.stop();
369
+ };
370
+ if (handleSignals) {
371
+ // Handle normal process exit (synchronous - runs before exit completes)
372
+ onExit = () => cleanup();
373
+ // Handle SIGINT (Ctrl+C from shell, not from TUI input) and SIGTERM
374
+ onSignal = (signal) => {
375
+ cleanup();
376
+ if (!exitOnSignal)
377
+ return;
378
+ const code = signalExitCodes[signal] ?? 0;
379
+ requestExit(code);
380
+ };
381
+ // Handle uncaught exceptions - ensure error is visible before exit
382
+ onUncaughtException = (err) => {
383
+ cleanup();
384
+ // Write directly to terminal, bypassing console capture
385
+ writeToTerminal(`\n[effect-tui] Uncaught exception:\n${err.stack || err.message}\n`);
386
+ process.exit(1);
387
+ };
388
+ // Handle unhandled promise rejections
389
+ onUnhandledRejection = (reason) => {
390
+ cleanup();
391
+ const message = reason instanceof Error ? reason.stack || reason.message : String(reason);
392
+ writeToTerminal(`\n[effect-tui] Unhandled rejection:\n${message}\n`);
393
+ process.exit(1);
394
+ };
395
+ unregisterProcessHandlers = registerProcessHandlers({
396
+ onExit,
397
+ onSignal,
398
+ onUncaughtException,
399
+ onUnhandledRejection,
400
+ });
401
+ }
402
+ ;
403
+ renderer._container = null;
404
+ return renderer;
405
+ }
406
+ export function createRoot(renderer) {
407
+ const hostContext = {
408
+ requestRender: () => renderer.requestRender(),
409
+ requestImmediateRender: () => renderer.renderNow(),
410
+ };
411
+ const container = {
412
+ root: null,
413
+ ctx: hostContext,
414
+ };
415
+ const fiberRoot = reconciler.createContainer(container, 0, null, false, null, "", (err) => console.error(err), (err) => console.error(err), (err) => console.error(err), () => { }, null);
416
+ renderer._container = container;
417
+ return {
418
+ render(element, sync = false) {
419
+ const wrapped = React.createElement(RendererContext.Provider, { value: renderer }, element);
420
+ if (sync) {
421
+ flushSync(() => {
422
+ reconciler.updateContainer(wrapped, fiberRoot, null, null);
423
+ });
424
+ renderer.requestRender();
425
+ }
426
+ else {
427
+ reconciler.updateContainer(wrapped, fiberRoot, null, () => {
428
+ renderer.requestRender();
429
+ });
430
+ }
431
+ },
432
+ unmount() {
433
+ reconciler.updateContainer(null, fiberRoot, null, () => {
434
+ renderer.stop();
435
+ });
436
+ },
437
+ };
438
+ }
439
+ const stripQuery = (url) => url.split("?")[0];
440
+ const createRenderInstance = (renderer, root, element, stop, skipInitialRender = false) => {
441
+ if (!skipInitialRender) {
442
+ root.render(element, true);
443
+ }
444
+ let resolved = false;
445
+ let resolveExit = null;
446
+ let unregisterExitHandler = null;
447
+ const exitPromise = new Promise((resolve) => {
448
+ resolveExit = () => {
449
+ if (resolved)
450
+ return;
451
+ resolved = true;
452
+ resolve();
453
+ };
454
+ });
455
+ // Resolve the exit promise on process exit
456
+ // Note: Terminal cleanup is handled by createRenderer's exit handlers
457
+ const onExit = () => {
458
+ resolveExit?.();
459
+ };
460
+ unregisterExitHandler = registerProcessHandlers({ onExit });
461
+ const unmount = () => {
462
+ if (unregisterExitHandler) {
463
+ unregisterExitHandler();
464
+ unregisterExitHandler = null;
465
+ }
466
+ if (!resolved) {
467
+ resolved = true;
468
+ stop();
469
+ resolveExit?.();
470
+ }
471
+ };
472
+ const rerender = (next) => {
473
+ if (resolved)
474
+ return;
475
+ root.render(next);
476
+ };
477
+ // Clean quit function - stop() + process.exit()
478
+ // The createRenderer exit handler will also run, but it's idempotent
479
+ const quit = (code = 0) => {
480
+ stop();
481
+ requestExit(code);
482
+ };
483
+ return {
484
+ renderer,
485
+ root,
486
+ rerender,
487
+ unmount,
488
+ waitUntilExit: () => exitPromise,
489
+ quit,
490
+ };
491
+ };
492
+ export function render(element, options) {
493
+ if (options?.dev && !options.importMeta) {
494
+ throw new Error("[effect-tui] render(..., { dev: true, importMeta }) is required in dev mode");
495
+ }
496
+ if (!options?.dev) {
497
+ const renderer = createRenderer({ mode: options?.mode });
498
+ const root = createRoot(renderer);
499
+ return createRenderInstance(renderer, root, element, () => renderer.stop());
500
+ }
501
+ const importMeta = options.importMeta;
502
+ const baseUrl = stripQuery(importMeta.url);
503
+ const cacheKey = `${baseUrl}::${options.mode ?? "fullscreen"}`;
504
+ const renderCache = getRenderCache();
505
+ const cached = renderCache.get(cacheKey);
506
+ if (cached)
507
+ return cached;
508
+ const renderer = createRenderer({ mode: options.mode });
509
+ const root = createRoot(renderer);
510
+ const entryPath = fileURLToPath(new URL(baseUrl));
511
+ const devRuntime = startDevRuntime(entryPath, renderer, root, { mode: options.mode });
512
+ const instance = createRenderInstance(renderer, root, element, () => {
513
+ void devRuntime.stop();
514
+ }, true);
515
+ renderCache.set(cacheKey, instance);
516
+ return instance;
517
+ }
518
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/renderer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type KeyMsg, type MouseMsg } from "@effect-tui/core";
2
+ export interface InputProcessorConfig {
3
+ exitOnCtrlC: boolean;
4
+ dispatchKey: (key: KeyMsg) => boolean;
5
+ dispatchMouse: (mouse: MouseMsg) => void;
6
+ dispatchPaste: (text: string) => void;
7
+ flushSync: <T>(fn: () => T) => T;
8
+ onInputProcessed: () => void;
9
+ onQuit?: () => void;
10
+ /** Optional filter to strip capability responses from raw input */
11
+ filterInput?: (input: string) => string;
12
+ }
13
+ /**
14
+ * Processes raw terminal input, handling keyboard, mouse, and bracketed paste.
15
+ */
16
+ export declare class InputProcessor {
17
+ private config;
18
+ private pasteActive;
19
+ private pasteBuffer;
20
+ private pendingInput;
21
+ constructor(config: InputProcessorConfig);
22
+ /**
23
+ * Process incoming data from stdin.
24
+ * Handles bracketed paste detection, key/mouse event decoding, and dispatch.
25
+ */
26
+ process(data: Buffer): void;
27
+ private emitInput;
28
+ private splitIncompleteCsi;
29
+ }
30
+ //# sourceMappingURL=InputProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputProcessor.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/input/InputProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhF,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,aAAa,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACvC;AAED;;GAEG;AACH,qBAAa,cAAc;IAKd,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;gBAEL,MAAM,EAAE,oBAAoB;IAEhD;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiD3B,OAAO,CAAC,SAAS;IA+CjB,OAAO,CAAC,kBAAkB;CAY1B"}