@effect-tui/react 0.1.0-alpha.1

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 (277) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +138 -0
  3. package/dist/jsx-dev-runtime.d.ts +3 -0
  4. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  5. package/dist/jsx-dev-runtime.js +3 -0
  6. package/dist/jsx-dev-runtime.js.map +1 -0
  7. package/dist/jsx-runtime.d.ts +47 -0
  8. package/dist/jsx-runtime.d.ts.map +1 -0
  9. package/dist/jsx-runtime.js +6 -0
  10. package/dist/jsx-runtime.js.map +1 -0
  11. package/dist/src/codeblock.d.ts +9 -0
  12. package/dist/src/codeblock.d.ts.map +1 -0
  13. package/dist/src/codeblock.js +24 -0
  14. package/dist/src/codeblock.js.map +1 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.d.ts.map +1 -0
  17. package/dist/src/constants.js +3 -0
  18. package/dist/src/constants.js.map +1 -0
  19. package/dist/src/debug/DiagnosticsPanel.d.ts +7 -0
  20. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -0
  21. package/dist/src/debug/DiagnosticsPanel.js +13 -0
  22. package/dist/src/debug/DiagnosticsPanel.js.map +1 -0
  23. package/dist/src/highlight.d.ts +20 -0
  24. package/dist/src/highlight.d.ts.map +1 -0
  25. package/dist/src/highlight.js +51 -0
  26. package/dist/src/highlight.js.map +1 -0
  27. package/dist/src/hooks/index.d.ts +4 -0
  28. package/dist/src/hooks/index.d.ts.map +1 -0
  29. package/dist/src/hooks/index.js +3 -0
  30. package/dist/src/hooks/index.js.map +1 -0
  31. package/dist/src/hooks/use-keyboard.d.ts +18 -0
  32. package/dist/src/hooks/use-keyboard.d.ts.map +1 -0
  33. package/dist/src/hooks/use-keyboard.js +26 -0
  34. package/dist/src/hooks/use-keyboard.js.map +1 -0
  35. package/dist/src/hooks/use-paste.d.ts +5 -0
  36. package/dist/src/hooks/use-paste.d.ts.map +1 -0
  37. package/dist/src/hooks/use-paste.js +14 -0
  38. package/dist/src/hooks/use-paste.js.map +1 -0
  39. package/dist/src/hooks/useFrameStats.d.ts +7 -0
  40. package/dist/src/hooks/useFrameStats.d.ts.map +1 -0
  41. package/dist/src/hooks/useFrameStats.js +28 -0
  42. package/dist/src/hooks/useFrameStats.js.map +1 -0
  43. package/dist/src/hosts/base.d.ts +22 -0
  44. package/dist/src/hosts/base.d.ts.map +1 -0
  45. package/dist/src/hosts/base.js +53 -0
  46. package/dist/src/hosts/base.js.map +1 -0
  47. package/dist/src/hosts/box.d.ts +26 -0
  48. package/dist/src/hosts/box.d.ts.map +1 -0
  49. package/dist/src/hosts/box.js +84 -0
  50. package/dist/src/hosts/box.js.map +1 -0
  51. package/dist/src/hosts/canvas.d.ts +48 -0
  52. package/dist/src/hosts/canvas.d.ts.map +1 -0
  53. package/dist/src/hosts/canvas.js +109 -0
  54. package/dist/src/hosts/canvas.js.map +1 -0
  55. package/dist/src/hosts/codeblock.d.ts +32 -0
  56. package/dist/src/hosts/codeblock.d.ts.map +1 -0
  57. package/dist/src/hosts/codeblock.js +118 -0
  58. package/dist/src/hosts/codeblock.js.map +1 -0
  59. package/dist/src/hosts/hstack.d.ts +18 -0
  60. package/dist/src/hosts/hstack.d.ts.map +1 -0
  61. package/dist/src/hosts/hstack.js +45 -0
  62. package/dist/src/hosts/hstack.js.map +1 -0
  63. package/dist/src/hosts/index.d.ts +16 -0
  64. package/dist/src/hosts/index.d.ts.map +1 -0
  65. package/dist/src/hosts/index.js +40 -0
  66. package/dist/src/hosts/index.js.map +1 -0
  67. package/dist/src/hosts/spacer.d.ts +19 -0
  68. package/dist/src/hosts/spacer.d.ts.map +1 -0
  69. package/dist/src/hosts/spacer.js +28 -0
  70. package/dist/src/hosts/spacer.js.map +1 -0
  71. package/dist/src/hosts/text.d.ts +43 -0
  72. package/dist/src/hosts/text.d.ts.map +1 -0
  73. package/dist/src/hosts/text.js +148 -0
  74. package/dist/src/hosts/text.js.map +1 -0
  75. package/dist/src/hosts/vstack.d.ts +18 -0
  76. package/dist/src/hosts/vstack.d.ts.map +1 -0
  77. package/dist/src/hosts/vstack.js +45 -0
  78. package/dist/src/hosts/vstack.js.map +1 -0
  79. package/dist/src/hosts/zstack.d.ts +20 -0
  80. package/dist/src/hosts/zstack.d.ts.map +1 -0
  81. package/dist/src/hosts/zstack.js +65 -0
  82. package/dist/src/hosts/zstack.js.map +1 -0
  83. package/dist/src/index.d.ts +20 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +20 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/inline/index.d.ts +32 -0
  88. package/dist/src/inline/index.d.ts.map +1 -0
  89. package/dist/src/inline/index.js +111 -0
  90. package/dist/src/inline/index.js.map +1 -0
  91. package/dist/src/jsx.d.ts +2 -0
  92. package/dist/src/jsx.d.ts.map +1 -0
  93. package/dist/src/jsx.js +4 -0
  94. package/dist/src/jsx.js.map +1 -0
  95. package/dist/src/motion/color-motion-value.d.ts +32 -0
  96. package/dist/src/motion/color-motion-value.d.ts.map +1 -0
  97. package/dist/src/motion/color-motion-value.js +80 -0
  98. package/dist/src/motion/color-motion-value.js.map +1 -0
  99. package/dist/src/motion/color.d.ts +30 -0
  100. package/dist/src/motion/color.d.ts.map +1 -0
  101. package/dist/src/motion/color.js +172 -0
  102. package/dist/src/motion/color.js.map +1 -0
  103. package/dist/src/motion/color.test.d.ts +2 -0
  104. package/dist/src/motion/color.test.d.ts.map +1 -0
  105. package/dist/src/motion/color.test.js +97 -0
  106. package/dist/src/motion/color.test.js.map +1 -0
  107. package/dist/src/motion/event-emitter.d.ts +18 -0
  108. package/dist/src/motion/event-emitter.d.ts.map +1 -0
  109. package/dist/src/motion/event-emitter.js +30 -0
  110. package/dist/src/motion/event-emitter.js.map +1 -0
  111. package/dist/src/motion/frame.d.ts +9 -0
  112. package/dist/src/motion/frame.d.ts.map +1 -0
  113. package/dist/src/motion/frame.js +51 -0
  114. package/dist/src/motion/frame.js.map +1 -0
  115. package/dist/src/motion/hooks.d.ts +75 -0
  116. package/dist/src/motion/hooks.d.ts.map +1 -0
  117. package/dist/src/motion/hooks.js +190 -0
  118. package/dist/src/motion/hooks.js.map +1 -0
  119. package/dist/src/motion/index.d.ts +4 -0
  120. package/dist/src/motion/index.d.ts.map +1 -0
  121. package/dist/src/motion/index.js +7 -0
  122. package/dist/src/motion/index.js.map +1 -0
  123. package/dist/src/motion/motion-value.d.ts +40 -0
  124. package/dist/src/motion/motion-value.d.ts.map +1 -0
  125. package/dist/src/motion/motion-value.js +109 -0
  126. package/dist/src/motion/motion-value.js.map +1 -0
  127. package/dist/src/motion/motion-value.test.d.ts +2 -0
  128. package/dist/src/motion/motion-value.test.d.ts.map +1 -0
  129. package/dist/src/motion/motion-value.test.js +177 -0
  130. package/dist/src/motion/motion-value.test.js.map +1 -0
  131. package/dist/src/motion/spring-math.d.ts +28 -0
  132. package/dist/src/motion/spring-math.d.ts.map +1 -0
  133. package/dist/src/motion/spring-math.js +81 -0
  134. package/dist/src/motion/spring-math.js.map +1 -0
  135. package/dist/src/motion/types.d.ts +25 -0
  136. package/dist/src/motion/types.d.ts.map +1 -0
  137. package/dist/src/motion/types.js +13 -0
  138. package/dist/src/motion/types.js.map +1 -0
  139. package/dist/src/output.d.ts +47 -0
  140. package/dist/src/output.d.ts.map +1 -0
  141. package/dist/src/output.js +125 -0
  142. package/dist/src/output.js.map +1 -0
  143. package/dist/src/profiler.d.ts +6 -0
  144. package/dist/src/profiler.d.ts.map +1 -0
  145. package/dist/src/profiler.js +73 -0
  146. package/dist/src/profiler.js.map +1 -0
  147. package/dist/src/reconciler/host-config.d.ts +16 -0
  148. package/dist/src/reconciler/host-config.d.ts.map +1 -0
  149. package/dist/src/reconciler/host-config.js +174 -0
  150. package/dist/src/reconciler/host-config.js.map +1 -0
  151. package/dist/src/reconciler/types.d.ts +52 -0
  152. package/dist/src/reconciler/types.d.ts.map +1 -0
  153. package/dist/src/reconciler/types.js +2 -0
  154. package/dist/src/reconciler/types.js.map +1 -0
  155. package/dist/src/renderer.d.ts +101 -0
  156. package/dist/src/renderer.d.ts.map +1 -0
  157. package/dist/src/renderer.js +509 -0
  158. package/dist/src/renderer.js.map +1 -0
  159. package/dist/src/terminal.d.ts +37 -0
  160. package/dist/src/terminal.d.ts.map +1 -0
  161. package/dist/src/terminal.js +65 -0
  162. package/dist/src/terminal.js.map +1 -0
  163. package/dist/src/test/index.d.ts +3 -0
  164. package/dist/src/test/index.d.ts.map +1 -0
  165. package/dist/src/test/index.js +3 -0
  166. package/dist/src/test/index.js.map +1 -0
  167. package/dist/src/test/mock-streams.d.ts +44 -0
  168. package/dist/src/test/mock-streams.d.ts.map +1 -0
  169. package/dist/src/test/mock-streams.js +136 -0
  170. package/dist/src/test/mock-streams.js.map +1 -0
  171. package/dist/src/test/render-tui.d.ts +47 -0
  172. package/dist/src/test/render-tui.d.ts.map +1 -0
  173. package/dist/src/test/render-tui.js +76 -0
  174. package/dist/src/test/render-tui.js.map +1 -0
  175. package/dist/src/trace/SpanTree.d.ts +10 -0
  176. package/dist/src/trace/SpanTree.d.ts.map +1 -0
  177. package/dist/src/trace/SpanTree.js +104 -0
  178. package/dist/src/trace/SpanTree.js.map +1 -0
  179. package/dist/src/trace/index.d.ts +30 -0
  180. package/dist/src/trace/index.d.ts.map +1 -0
  181. package/dist/src/trace/index.js +142 -0
  182. package/dist/src/trace/index.js.map +1 -0
  183. package/dist/src/trace/location.d.ts +9 -0
  184. package/dist/src/trace/location.d.ts.map +1 -0
  185. package/dist/src/trace/location.js +88 -0
  186. package/dist/src/trace/location.js.map +1 -0
  187. package/dist/src/trace/span-processor.d.ts +16 -0
  188. package/dist/src/trace/span-processor.d.ts.map +1 -0
  189. package/dist/src/trace/span-processor.js +54 -0
  190. package/dist/src/trace/span-processor.js.map +1 -0
  191. package/dist/src/trace/span-state.d.ts +79 -0
  192. package/dist/src/trace/span-state.d.ts.map +1 -0
  193. package/dist/src/trace/span-state.js +229 -0
  194. package/dist/src/trace/span-state.js.map +1 -0
  195. package/dist/src/trace/tui-logger.d.ts +8 -0
  196. package/dist/src/trace/tui-logger.d.ts.map +1 -0
  197. package/dist/src/trace/tui-logger.js +70 -0
  198. package/dist/src/trace/tui-logger.js.map +1 -0
  199. package/dist/src/utils/border.d.ts +31 -0
  200. package/dist/src/utils/border.d.ts.map +1 -0
  201. package/dist/src/utils/border.js +81 -0
  202. package/dist/src/utils/border.js.map +1 -0
  203. package/dist/src/utils/flex-layout.d.ts +20 -0
  204. package/dist/src/utils/flex-layout.d.ts.map +1 -0
  205. package/dist/src/utils/flex-layout.js +85 -0
  206. package/dist/src/utils/flex-layout.js.map +1 -0
  207. package/dist/src/utils/index.d.ts +5 -0
  208. package/dist/src/utils/index.d.ts.map +1 -0
  209. package/dist/src/utils/index.js +5 -0
  210. package/dist/src/utils/index.js.map +1 -0
  211. package/dist/src/utils/padding.d.ts +26 -0
  212. package/dist/src/utils/padding.d.ts.map +1 -0
  213. package/dist/src/utils/padding.js +34 -0
  214. package/dist/src/utils/padding.js.map +1 -0
  215. package/dist/src/utils/styles.d.ts +13 -0
  216. package/dist/src/utils/styles.d.ts.map +1 -0
  217. package/dist/src/utils/styles.js +5 -0
  218. package/dist/src/utils/styles.js.map +1 -0
  219. package/dist/src/visualize/index.d.ts +50 -0
  220. package/dist/src/visualize/index.d.ts.map +1 -0
  221. package/dist/src/visualize/index.js +194 -0
  222. package/dist/src/visualize/index.js.map +1 -0
  223. package/dist/tsconfig.tsbuildinfo +1 -0
  224. package/package.json +94 -0
  225. package/src/codeblock.tsx +47 -0
  226. package/src/constants.ts +2 -0
  227. package/src/debug/DiagnosticsPanel.tsx +38 -0
  228. package/src/highlight.ts +76 -0
  229. package/src/hooks/index.ts +3 -0
  230. package/src/hooks/use-keyboard.ts +37 -0
  231. package/src/hooks/use-paste.ts +14 -0
  232. package/src/hooks/useFrameStats.ts +32 -0
  233. package/src/hosts/base.ts +65 -0
  234. package/src/hosts/box.ts +105 -0
  235. package/src/hosts/canvas.ts +155 -0
  236. package/src/hosts/codeblock.ts +145 -0
  237. package/src/hosts/hstack.ts +64 -0
  238. package/src/hosts/index.ts +45 -0
  239. package/src/hosts/spacer.ts +40 -0
  240. package/src/hosts/text.ts +175 -0
  241. package/src/hosts/vstack.ts +64 -0
  242. package/src/hosts/zstack.ts +77 -0
  243. package/src/index.ts +62 -0
  244. package/src/inline/index.tsx +181 -0
  245. package/src/jsx.ts +3 -0
  246. package/src/motion/color-motion-value.ts +90 -0
  247. package/src/motion/color.test.ts +115 -0
  248. package/src/motion/color.ts +191 -0
  249. package/src/motion/event-emitter.ts +35 -0
  250. package/src/motion/frame.ts +59 -0
  251. package/src/motion/hooks.ts +237 -0
  252. package/src/motion/index.ts +17 -0
  253. package/src/motion/motion-value.test.ts +222 -0
  254. package/src/motion/motion-value.ts +140 -0
  255. package/src/motion/spring-math.ts +114 -0
  256. package/src/motion/types.ts +34 -0
  257. package/src/output.ts +156 -0
  258. package/src/profiler.ts +88 -0
  259. package/src/reconciler/host-config.ts +277 -0
  260. package/src/reconciler/types.ts +66 -0
  261. package/src/renderer.ts +661 -0
  262. package/src/terminal.ts +67 -0
  263. package/src/test/index.ts +8 -0
  264. package/src/test/mock-streams.ts +149 -0
  265. package/src/test/render-tui.ts +118 -0
  266. package/src/trace/SpanTree.tsx +195 -0
  267. package/src/trace/index.tsx +205 -0
  268. package/src/trace/location.ts +90 -0
  269. package/src/trace/span-processor.ts +65 -0
  270. package/src/trace/span-state.ts +286 -0
  271. package/src/trace/tui-logger.ts +72 -0
  272. package/src/utils/border.ts +108 -0
  273. package/src/utils/flex-layout.ts +125 -0
  274. package/src/utils/index.ts +4 -0
  275. package/src/utils/padding.ts +45 -0
  276. package/src/utils/styles.ts +14 -0
  277. package/src/visualize/index.tsx +305 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Border utilities shared between box and canvas hosts.
3
+ */
4
+ /**
5
+ * Get border characters for a given border style.
6
+ * Returns empty strings for "none" (drawing code should skip when border is "none").
7
+ */
8
+ export function borderChars(kind) {
9
+ switch (kind) {
10
+ case "rounded":
11
+ return { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" };
12
+ case "square":
13
+ return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" };
14
+ case "ascii":
15
+ return { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|" };
16
+ default:
17
+ return { tl: "", tr: "", bl: "", br: "", h: "", v: "" };
18
+ }
19
+ }
20
+ /**
21
+ * Draw a border around a rectangle.
22
+ * If clip is provided, only draws within the clip bounds (for canvas).
23
+ * If clip is not provided, draws the full border (for box).
24
+ */
25
+ export function drawBorder(buffer, x, y, w, h, chars, style, clip) {
26
+ if (w < 2 || h < 2)
27
+ return;
28
+ const tlcp = chars.tl.codePointAt(0);
29
+ const trcp = chars.tr.codePointAt(0);
30
+ const blcp = chars.bl.codePointAt(0);
31
+ const brcp = chars.br.codePointAt(0);
32
+ const hcp = chars.h.codePointAt(0);
33
+ const vcp = chars.v.codePointAt(0);
34
+ if (clip) {
35
+ // Clipped drawing (for canvas)
36
+ const { ox, oy, w: cw, h: ch } = clip;
37
+ const inBounds = (px, py) => px >= ox && px < ox + cw && py >= oy && py < oy + ch;
38
+ // Corners
39
+ if (inBounds(x, y))
40
+ buffer.drawCP(x, y, tlcp, style);
41
+ if (inBounds(x + w - 1, y))
42
+ buffer.drawCP(x + w - 1, y, trcp, style);
43
+ if (inBounds(x, y + h - 1))
44
+ buffer.drawCP(x, y + h - 1, blcp, style);
45
+ if (inBounds(x + w - 1, y + h - 1))
46
+ buffer.drawCP(x + w - 1, y + h - 1, brcp, style);
47
+ // Horizontal lines
48
+ for (let col = 1; col < w - 1; col++) {
49
+ const xx = x + col;
50
+ if (inBounds(xx, y))
51
+ buffer.drawCP(xx, y, hcp, style);
52
+ if (inBounds(xx, y + h - 1))
53
+ buffer.drawCP(xx, y + h - 1, hcp, style);
54
+ }
55
+ // Vertical lines
56
+ for (let row = 1; row < h - 1; row++) {
57
+ const yy = y + row;
58
+ if (inBounds(x, yy))
59
+ buffer.drawCP(x, yy, vcp, style);
60
+ if (inBounds(x + w - 1, yy))
61
+ buffer.drawCP(x + w - 1, yy, vcp, style);
62
+ }
63
+ }
64
+ else {
65
+ // Full drawing (for box)
66
+ // Corners
67
+ buffer.drawCP(x, y, tlcp, style);
68
+ buffer.drawCP(x + w - 1, y, trcp, style);
69
+ buffer.drawCP(x, y + h - 1, blcp, style);
70
+ buffer.drawCP(x + w - 1, y + h - 1, brcp, style);
71
+ // Horizontal lines
72
+ buffer.fillRect(x + 1, y, w - 2, 1, hcp, style);
73
+ buffer.fillRect(x + 1, y + h - 1, w - 2, 1, hcp, style);
74
+ // Vertical lines
75
+ for (let yy = y + 1; yy < y + h - 1; yy++) {
76
+ buffer.drawCP(x, yy, vcp, style);
77
+ buffer.drawCP(x + w - 1, yy, vcp, style);
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=border.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border.js","sourceRoot":"","sources":["../../../src/utils/border.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Generic flex layout algorithm for VStack and HStack.
3
+ */
4
+ import type { HostInstance, Rect, Size } from "../reconciler/types.js";
5
+ export type FlexAxis = "vertical" | "horizontal";
6
+ export type FlexAlignment = "start" | "center" | "end";
7
+ export interface FlexMeasureResult {
8
+ sizes: Size[];
9
+ totalSize: Size;
10
+ }
11
+ /**
12
+ * Measure children along a flex axis.
13
+ * Returns cached sizes and total size.
14
+ */
15
+ export declare function measureFlex(axis: FlexAxis, children: HostInstance[], spacing: number, maxMain: number, maxCross: number): FlexMeasureResult;
16
+ /**
17
+ * Layout children along a flex axis using cached sizes.
18
+ */
19
+ export declare function layoutFlex(axis: FlexAxis, children: HostInstance[], cachedSizes: Size[], rect: Rect, spacing: number, alignment: FlexAlignment, stretchCross: boolean): void;
20
+ //# sourceMappingURL=flex-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flex-layout.d.ts","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAGtE,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAA;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,SAAS,EAAE,IAAI,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,iBAAiB,CA2BnB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,EAAE,IAAI,EAAE,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,OAAO,GACpB,IAAI,CA2DN"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Generic flex layout algorithm for VStack and HStack.
3
+ */
4
+ /**
5
+ * Measure children along a flex axis.
6
+ * Returns cached sizes and total size.
7
+ */
8
+ export function measureFlex(axis, children, spacing, maxMain, maxCross) {
9
+ const sizes = [];
10
+ let totalMain = 0;
11
+ let maxChildCross = 0;
12
+ for (let i = 0; i < children.length; i++) {
13
+ const child = children[i];
14
+ const remainingMain = Math.max(0, maxMain - totalMain);
15
+ // For vertical: maxW=maxCross, maxH=remainingMain
16
+ // For horizontal: maxW=remainingMain, maxH=maxCross
17
+ const [childMaxW, childMaxH] = axis === "vertical" ? [maxCross, remainingMain] : [remainingMain, maxCross];
18
+ const size = child.measure(childMaxW, childMaxH);
19
+ sizes.push(size);
20
+ const childMain = axis === "vertical" ? size.h : size.w;
21
+ const childCross = axis === "vertical" ? size.w : size.h;
22
+ totalMain += childMain;
23
+ if (i < children.length - 1)
24
+ totalMain += spacing;
25
+ maxChildCross = Math.max(maxChildCross, childCross);
26
+ }
27
+ const totalSize = axis === "vertical" ? { w: maxChildCross, h: totalMain } : { w: totalMain, h: maxChildCross };
28
+ return { sizes, totalSize };
29
+ }
30
+ /**
31
+ * Layout children along a flex axis using cached sizes.
32
+ */
33
+ export function layoutFlex(axis, children, cachedSizes, rect, spacing, alignment, stretchCross) {
34
+ // Calculate totals
35
+ let totalNaturalMain = 0;
36
+ let totalFlexGrow = 0;
37
+ const totalSpacing = Math.max(0, (children.length - 1) * spacing);
38
+ for (let i = 0; i < children.length; i++) {
39
+ const child = children[i];
40
+ const size = cachedSizes[i] ?? child.measure(rect.w, rect.h);
41
+ const childMain = axis === "vertical" ? size.h : size.w;
42
+ totalNaturalMain += childMain;
43
+ totalFlexGrow += child.flexGrow ?? 0;
44
+ }
45
+ // Calculate extra space to distribute
46
+ const availableMain = axis === "vertical" ? rect.h : rect.w;
47
+ const extraSpace = Math.max(0, availableMain - totalNaturalMain - totalSpacing);
48
+ // Layout children
49
+ let mainPos = axis === "vertical" ? rect.y : rect.x;
50
+ for (let i = 0; i < children.length; i++) {
51
+ const child = children[i];
52
+ const size = cachedSizes[i] ?? { w: 0, h: 0 };
53
+ const flexGrow = child.flexGrow ?? 0;
54
+ const flexExtra = totalFlexGrow > 0 ? (extraSpace * flexGrow) / totalFlexGrow : 0;
55
+ const childMain = (axis === "vertical" ? size.h : size.w) + flexExtra;
56
+ const childCross = axis === "vertical" ? size.w : size.h;
57
+ const crossSize = axis === "vertical" ? rect.w : rect.h;
58
+ const crossStart = axis === "vertical" ? rect.x : rect.y;
59
+ // Calculate cross position based on alignment
60
+ let crossPos = crossStart;
61
+ if (alignment === "center") {
62
+ crossPos = crossStart + Math.floor((crossSize - childCross) / 2);
63
+ }
64
+ else if (alignment === "end") {
65
+ crossPos = crossStart + crossSize - childCross;
66
+ }
67
+ // Build child rect
68
+ const childRect = axis === "vertical"
69
+ ? {
70
+ x: crossPos,
71
+ y: mainPos,
72
+ w: stretchCross ? crossSize : childCross,
73
+ h: childMain,
74
+ }
75
+ : {
76
+ x: mainPos,
77
+ y: crossPos,
78
+ w: childMain,
79
+ h: stretchCross ? crossSize : childCross,
80
+ };
81
+ child.layout(childRect);
82
+ mainPos += childMain + spacing;
83
+ }
84
+ }
85
+ //# sourceMappingURL=flex-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flex-layout.js","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { type BorderKind, type BorderChars, borderChars, type ClipRect, drawBorder } from "./border.js";
2
+ export { type Padding, type PaddingInput, resolvePadding } from "./padding.js";
3
+ export { type StyleOptions } from "./styles.js";
4
+ export { type FlexAxis, type FlexAlignment, type FlexMeasureResult, measureFlex, layoutFlex } from "./flex-layout.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { borderChars, drawBorder } from "./border.js";
2
+ export { resolvePadding } from "./padding.js";
3
+ export {} from "./styles.js";
4
+ export { measureFlex, layoutFlex } from "./flex-layout.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,WAAW,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAmC,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAqB,MAAM,aAAa,CAAA;AAC/C,OAAO,EAA6D,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Padding utilities shared between box, canvas, and codeblock hosts.
3
+ */
4
+ export interface Padding {
5
+ top: number;
6
+ right: number;
7
+ bottom: number;
8
+ left: number;
9
+ }
10
+ export type PaddingInput = number | {
11
+ x?: number;
12
+ y?: number;
13
+ top?: number;
14
+ right?: number;
15
+ bottom?: number;
16
+ left?: number;
17
+ };
18
+ /**
19
+ * Resolve padding input to a normalized Padding object.
20
+ * Supports:
21
+ * - number: uniform padding on all sides
22
+ * - { x, y }: horizontal and vertical padding
23
+ * - { top, right, bottom, left }: individual sides
24
+ */
25
+ export declare function resolvePadding(p?: PaddingInput): Padding;
26
+ //# sourceMappingURL=padding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"padding.d.ts","sourceRoot":"","sources":["../../../src/utils/padding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5F;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAsBxD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Padding utilities shared between box, canvas, and codeblock hosts.
3
+ */
4
+ /**
5
+ * Resolve padding input to a normalized Padding object.
6
+ * Supports:
7
+ * - number: uniform padding on all sides
8
+ * - { x, y }: horizontal and vertical padding
9
+ * - { top, right, bottom, left }: individual sides
10
+ */
11
+ export function resolvePadding(p) {
12
+ if (p === undefined) {
13
+ return { top: 0, right: 0, bottom: 0, left: 0 };
14
+ }
15
+ if (typeof p === "number") {
16
+ return { top: p, right: p, bottom: p, left: p };
17
+ }
18
+ // x/y shorthand takes precedence if specified
19
+ if (p.x !== undefined || p.y !== undefined) {
20
+ return {
21
+ top: p.y ?? 0,
22
+ bottom: p.y ?? 0,
23
+ left: p.x ?? 0,
24
+ right: p.x ?? 0,
25
+ };
26
+ }
27
+ return {
28
+ top: p.top ?? 0,
29
+ right: p.right ?? 0,
30
+ bottom: p.bottom ?? 0,
31
+ left: p.left ?? 0,
32
+ };
33
+ }
34
+ //# sourceMappingURL=padding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"padding.js","sourceRoot":"","sources":["../../../src/utils/padding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,CAAgB;IAC7C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC;IACD,8CAA8C;IAC9C,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO;YACL,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAChB,CAAA;IACH,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Style utilities for building palette-compatible style objects.
3
+ */
4
+ import type { ColorValue } from "@effect-tui/core";
5
+ export interface StyleOptions {
6
+ fg?: ColorValue;
7
+ bg?: ColorValue;
8
+ bold?: boolean;
9
+ italic?: boolean;
10
+ underline?: boolean;
11
+ inverse?: boolean;
12
+ }
13
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/utils/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Style utilities for building palette-compatible style objects.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/utils/styles.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,50 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ interface VisualizeOptions {
3
+ /** Show the result value below completion status */
4
+ showResult?: boolean;
5
+ }
6
+ interface InlineRendererService {
7
+ readonly stdout: NodeJS.WriteStream;
8
+ readonly stdin: NodeJS.ReadStream;
9
+ }
10
+ declare const InlineRenderer_base: Context.TagClass<InlineRenderer, "@effect-tui/react/InlineRenderer", InlineRendererService>;
11
+ /**
12
+ * Service that manages terminal state for inline rendering.
13
+ * Hides cursor on acquire, shows cursor on release.
14
+ */
15
+ export declare class InlineRenderer extends InlineRenderer_base {
16
+ }
17
+ /**
18
+ * Layer that provides InlineRenderer service.
19
+ * Manages terminal state: hides cursor on start, restores on finalize.
20
+ */
21
+ export declare const InlineRendererLive: Layer.Layer<InlineRenderer>;
22
+ /**
23
+ * Wrap an Effect with inline visualization.
24
+ * Shows a spinner while running, then success/failure status.
25
+ * Returns the effect's result or propagates its error.
26
+ *
27
+ * Requires InlineRenderer service (use InlineRendererLive layer).
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const program = Effect.gen(function* () {
32
+ * const result = yield* visualize("Fetching data", fetchData)
33
+ * yield* visualize("Processing", processData(result))
34
+ * }).pipe(Effect.provide(InlineRendererLive))
35
+ * ```
36
+ */
37
+ export declare const visualize: <A, E, R>(label: string, effect: Effect.Effect<A, E, R>, options?: VisualizeOptions) => Effect.Effect<A, E, R | InlineRenderer>;
38
+ /**
39
+ * Self-contained visualize that manages its own terminal state.
40
+ * Use this for single visualize() calls. For multiple sequential calls,
41
+ * use visualize() with InlineRendererLive layer for better cursor handling.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const result = yield* visualizeSingle("Fetching data", fetchData)
46
+ * ```
47
+ */
48
+ export declare const visualizeSingle: <A, E, R>(label: string, effect: Effect.Effect<A, E, R>, options?: VisualizeOptions) => Effect.Effect<A, E, R>;
49
+ export {};
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visualize/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAS,OAAO,EAAY,MAAM,EAAe,KAAK,EAAU,MAAM,QAAQ,CAAA;AAYrF,UAAU,gBAAgB;IACxB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AA2HD,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAA;CAClC;;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CA2B1D,CAAA;AAMD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,OAAO,MAAM,EACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,gBAAgB,KACzB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,cAAc,CAuErC,CAAA;AAMJ;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,OAAO,MAAM,EACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,gBAAgB,KACzB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC6F,CAAA"}
@@ -0,0 +1,194 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@effect-tui/react/jsx-runtime";
2
+ // Effect visualization wrapper using React
3
+ // Uses Effect Layer for proper terminal state management across multiple calls
4
+ import { useState, useEffect } from "react";
5
+ import { Cause, Context, Duration, Effect, Exit, Fiber, Layer, Option } from "effect";
6
+ import { Colors } from "@effect-tui/core";
7
+ import { createRenderer, createRoot } from "../renderer.js";
8
+ import { ANSI } from "../terminal.js";
9
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠸", "⠴", "⠦", "⠇"];
10
+ const SPIN_INTERVAL_MS = 80;
11
+ const ELAPSED_INTERVAL_MS = 16;
12
+ const COMPLETION_DELAY_MS = 360;
13
+ // Bridges Effect execution with React rendering
14
+ class VisualizerState {
15
+ status = "pending";
16
+ spinnerIndex = 0;
17
+ elapsedMs = 0;
18
+ errorSummary;
19
+ result;
20
+ showResult = false;
21
+ listeners = new Set();
22
+ update(patch) {
23
+ Object.assign(this, patch);
24
+ this.listeners.forEach((l) => l());
25
+ }
26
+ subscribe(listener) {
27
+ this.listeners.add(listener);
28
+ return () => this.listeners.delete(listener);
29
+ }
30
+ }
31
+ const formatDuration = (ms) => Duration.format(Duration.millis(Math.max(0, Math.round(ms))));
32
+ const formatResult = (value) => {
33
+ if (value === undefined)
34
+ return "undefined";
35
+ if (value === null)
36
+ return "null";
37
+ if (typeof value === "string")
38
+ return JSON.stringify(value);
39
+ if (typeof value === "number" || typeof value === "boolean")
40
+ return String(value);
41
+ try {
42
+ return JSON.stringify(value);
43
+ }
44
+ catch {
45
+ return String(value);
46
+ }
47
+ };
48
+ const summarizeCause = (cause) => {
49
+ const failure = Cause.failureOption(cause);
50
+ if (Option.isSome(failure)) {
51
+ const error = failure.value;
52
+ if (error && typeof error === "object" && "_tag" in error && "message" in error) {
53
+ const message = String(error.message).trim();
54
+ return message ? `${error._tag}: ${message}` : String(error._tag);
55
+ }
56
+ if (error && typeof error === "object" && "message" in error) {
57
+ return String(error.message);
58
+ }
59
+ return String(error);
60
+ }
61
+ const pretty = Cause.pretty(cause, { renderErrorCause: false });
62
+ const firstLine = pretty.split("\n").find((line) => line.trim().length > 0);
63
+ return firstLine ?? "Unknown failure";
64
+ };
65
+ function Visualizer({ state, label }) {
66
+ const [, forceUpdate] = useState(0);
67
+ useEffect(() => {
68
+ return state.subscribe(() => forceUpdate((n) => n + 1));
69
+ }, [state]);
70
+ const elapsed = formatDuration(state.elapsedMs);
71
+ if (state.status === "pending") {
72
+ return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { fg: Colors.brightCyan, children: SPINNER_FRAMES[state.spinnerIndex] }), _jsx("text", { bold: true, fg: Colors.brightWhite, children: label })] }), _jsxs("text", { fg: Colors.gray(10), children: ["\u2514 Running\u2026 ", elapsed] })] }));
73
+ }
74
+ if (state.status === "success") {
75
+ const showingResult = state.showResult && state.result !== undefined;
76
+ return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { bold: true, fg: Colors.brightGreen, children: "\u2713" }), _jsx("text", { bold: true, fg: Colors.brightGreen, children: label })] }), showingResult && _jsxs("text", { fg: Colors.gray(20), children: ["\u251C ", formatResult(state.result)] }), _jsxs("text", { fg: Colors.green, children: [showingResult ? "└" : "└", " Completed in ", elapsed] })] }));
77
+ }
78
+ // failure
79
+ return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { bold: true, fg: Colors.brightRed, children: "\u2717" }), _jsx("text", { bold: true, fg: Colors.brightRed, children: label })] }), _jsxs("text", { fg: Colors.red, children: ["\u251C ", state.errorSummary ?? "Failed"] }), _jsxs("text", { fg: Colors.red, children: ["\u2514 Failed after ", elapsed] })] }));
80
+ }
81
+ /**
82
+ * Service that manages terminal state for inline rendering.
83
+ * Hides cursor on acquire, shows cursor on release.
84
+ */
85
+ export class InlineRenderer extends Context.Tag("@effect-tui/react/InlineRenderer")() {
86
+ }
87
+ /**
88
+ * Layer that provides InlineRenderer service.
89
+ * Manages terminal state: hides cursor on start, restores on finalize.
90
+ */
91
+ export const InlineRendererLive = Layer.scoped(InlineRenderer, Effect.gen(function* () {
92
+ const stdout = process.stdout;
93
+ const stdin = process.stdin;
94
+ // Setup: hide cursor, enable raw mode
95
+ stdout.write(ANSI.cursor.hide);
96
+ if (stdin.isTTY && stdin.setRawMode) {
97
+ stdin.setRawMode(true);
98
+ stdin.resume();
99
+ }
100
+ // Teardown on scope close: show cursor, disable raw mode, pause stdin
101
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
102
+ stdout.write(ANSI.cursor.show);
103
+ if (stdin.isTTY && stdin.setRawMode) {
104
+ stdin.setRawMode(false);
105
+ }
106
+ // Pause stdin so Node can exit
107
+ stdin.pause();
108
+ }));
109
+ return { stdout, stdin };
110
+ }));
111
+ // ============================================================================
112
+ // visualize() - uses InlineRenderer service
113
+ // ============================================================================
114
+ /**
115
+ * Wrap an Effect with inline visualization.
116
+ * Shows a spinner while running, then success/failure status.
117
+ * Returns the effect's result or propagates its error.
118
+ *
119
+ * Requires InlineRenderer service (use InlineRendererLive layer).
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * const program = Effect.gen(function* () {
124
+ * const result = yield* visualize("Fetching data", fetchData)
125
+ * yield* visualize("Processing", processData(result))
126
+ * }).pipe(Effect.provide(InlineRendererLive))
127
+ * ```
128
+ */
129
+ export const visualize = (label, effect, options) => Effect.gen(function* () {
130
+ const { stdout, stdin } = yield* InlineRenderer;
131
+ // Create renderer with skipTerminalSetup (Layer manages terminal state)
132
+ const renderer = createRenderer({
133
+ mode: "inline",
134
+ stdout,
135
+ stdin,
136
+ skipTerminalSetup: true,
137
+ });
138
+ const root = createRoot(renderer);
139
+ const state = new VisualizerState();
140
+ state.showResult = options?.showResult ?? false;
141
+ // Mount React component
142
+ root.render(_jsx(Visualizer, { state: state, label: label }));
143
+ // Spinner tick fiber
144
+ const startTime = Date.now();
145
+ const spinnerFiber = yield* Effect.fork(Effect.forever(Effect.gen(function* () {
146
+ yield* Effect.sleep(SPIN_INTERVAL_MS);
147
+ state.update({
148
+ spinnerIndex: (state.spinnerIndex + 1) % SPINNER_FRAMES.length,
149
+ });
150
+ renderer.requestRender();
151
+ })));
152
+ // High-frequency elapsed timer so duration display stays smooth
153
+ const elapsedFiber = yield* Effect.fork(Effect.forever(Effect.gen(function* () {
154
+ yield* Effect.sleep(ELAPSED_INTERVAL_MS);
155
+ state.update({ elapsedMs: Date.now() - startTime });
156
+ renderer.requestRender();
157
+ })));
158
+ // Run the actual effect
159
+ const exit = yield* Effect.exit(effect);
160
+ // Stop spinner, update state to final
161
+ yield* Fiber.interrupt(spinnerFiber);
162
+ yield* Fiber.interrupt(elapsedFiber);
163
+ const isSuccess = Exit.isSuccess(exit);
164
+ state.update(isSuccess
165
+ ? { status: "success", elapsedMs: Date.now() - startTime, result: exit.value }
166
+ : { status: "failure", elapsedMs: Date.now() - startTime, errorSummary: summarizeCause(exit.cause) });
167
+ renderer.requestRender();
168
+ renderer.flush(); // Ensure final state is rendered
169
+ // Wait for completion animation
170
+ yield* Effect.sleep(COMPLETION_DELAY_MS);
171
+ // Stop renderer (doesn't touch terminal state since skipTerminalSetup)
172
+ renderer.stop();
173
+ // Write newline to advance cursor past the output
174
+ stdout.write("\n");
175
+ // Return result or propagate failure
176
+ if (Exit.isSuccess(exit))
177
+ return exit.value;
178
+ return yield* Effect.failCause(exit.cause);
179
+ });
180
+ // ============================================================================
181
+ // Convenience: self-contained visualize that provides its own layer
182
+ // ============================================================================
183
+ /**
184
+ * Self-contained visualize that manages its own terminal state.
185
+ * Use this for single visualize() calls. For multiple sequential calls,
186
+ * use visualize() with InlineRendererLive layer for better cursor handling.
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * const result = yield* visualizeSingle("Fetching data", fetchData)
191
+ * ```
192
+ */
193
+ export const visualizeSingle = (label, effect, options) => Effect.scoped(visualize(label, effect, options).pipe(Effect.provide(InlineRendererLive)));
194
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/visualize/index.tsx"],"names":[],"mappings":"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"}